рекурсивное переименование файлов в unix

я знаю, что это будет помечено как дубликат, но я пытался искать в Google, и то, что я пытаюсь, не работает для меня.

У меня есть несколько файлов .txt в каталоге, мне нужно рекурсивно переименовать все файлы *.txt в *_XYZ.txt. XYZ определяется в переменной X.

Я пробовал ниже код:

file=`find ./ -type f -name "*.txt"|sed "s,^./,,g" |awk -F '.' '{print $1}'`

for i in "$file"
do
mv "$i" "$i_${X}.txt"
done

Любая помощь будет принята с благодарностью. Спасибо.


person User123    schedule 19.06.2018    source источник


Ответы (1)


Ваш скрипт уничтожает исходные имена файлов в переменной file, поэтому он не может переименовывать файлы.

Рабочий пример:

X="_XYZ"
for f in $(find . -type f ! -name "*$X.txt" -name "*.txt"); do 
    mv "$f" "${f%.txt}$X.txt"
done

Выход:

$ X="_XYZ"
$ find . -type f -name "*.txt"
./c_XYZ.txt
./aa/c.txt
./a.txt
./b.txt
$ for f in $(find . -type f ! -name "*$X.txt" -name "*.txt"); do mv "$f" "${f%.txt}$X.txt"; done
$ find . -type f -name "*.txt"
./b_XYZ.txt
./c_XYZ.txt
./aa/c_XYZ.txt
./a_XYZ.txt
person Maxim Egorushkin    schedule 20.06.2018
comment
Спасибо @Maxim :-). Это сработало. Я просто запутался в части mv. Пожалуйста, уточните команду, пожалуйста. - person User123; 20.06.2018
comment
@User123 ${f%.txt} отсекает конечный .txt из переменной f. См. tldp.org/LDP/abs/html/parameter-substitution.html. для более подробной информации. - person Maxim Egorushkin; 20.06.2018