переименование серии файлов с использованием xargs - PullRequest
0 голосов
/ 12 ноября 2018

Я хотел бы переименовать несколько файлов, выбранных с помощью find, в какой-то каталог, а затем использовать xargs и mv для переименования файлов с расширением параметра . Однако это не сработало ...

пример

mkdir test
touch abc.txt
touch def.txt

find . -type f -print0 | \
xargs -I {} -n 1 -0 mv {} "${{}/.txt/.tx}"

Результат

bad substitution
[1]    134 broken pipe  find . -type f -print0

Рабочий раствор :

for i in ./*.txt ; do mv "$i" "${i/.txt/.tx}" ; done

Хотя, наконец, у меня появился способ исправить проблему, я все же хочу знать, почему первый find + xargs способ не работает, так как я не думаю, что второй способ является общим для подобных задач. .

Спасибо!

1 Ответ

0 голосов
/ 12 ноября 2018

Помните, что подстановка переменных оболочки происходит за до запуска вашей команды.Поэтому, когда вы запускаете:

find . -type f -print0 | \
xargs -I {} -n 1 -0 mv {} "${{}/.txt/.tx}"

Оболочка пытается развернуть эту ${...} конструкцию до того, как xargs даже запустится ... и поскольку это содержимое этого выражения не является допустимой ссылкой на переменную оболочки, выполучить ошибку.Лучшим решением было бы использовать команду rename:

find . -type f -print0 | \
xargs -I {} -0 rename .txt .tx {}

И поскольку rename может работать с несколькими файлами, вы можете упростить это до:

find . -type f -print0 | \
xargs -0 rename .txt .tx
...