Есть идеи, почему это не работает? Я проверил много ссылок и не могу понять, почему я считаю синтаксис правильным. Я хочу найти файл maplist.txt.old, а затем переименовать его в maplist.txt в той же папке. Ошибок нет.
find ~ -type f -name csgo/maplist.txt.old -execdir mv csgo/maplist.txt.old maplist.txt \;
Вам нужно сопоставить полный путь с чем-то вроде *csgo/maplist.txt.old
.
Есть много способов справиться с этим. Поскольку вы ищете в ~ / csgo, вы можете перейти непосредственно в каталог в находке. Параметр -execdir запускает команду в каталоге. Итак, не сильно меняя ваш пример:
find ~/csgo -type f -name maplist.txt.old -execdir mv maplist.txt.old maplist.txt \;
Чтобы немного автоматизировать это, вы можете обработать это с помощью цикла bash для, например:
for file in $( find ~/csgo -type f -name maplist.txt.old ) ; do
mv $file $( echo $file | sed -e 's/\.old//' )
done
Я не понимаю, в чем преимущество цикла, он делает то же самое, что и ваша первая команда, но намного менее надежен (разрывы для имен файлов с пробелами, расширения без кавычек, можно упростить, используя расширение параметров вместо echo | sed
, Команда sed должна экранировать .
и привязывать old
к концу строки ...)
Преимущество состоит в том, что вам нужно дать файлу имя только один раз, и вы сможете легко настроить его для других файлов в будущем.
Вместо этого вы можете использовать это: -execdir sh -c 'mv "$1" "${1%.old}"' _ {} \;
Да, это расширяется до mv filename.txt.old filename.txt
, где $1
- это filename.txt.old
.
csgo / maplist.txt.old недействителен, вы должны использовать имя файла, а не часть пути