#linux #shell #mv
#linux #оболочка #mv
Вопрос:
У меня есть много файлов, таких как 1a1, 2a2, 3a3, и я хочу преобразовать имена файлов в 1b1, 2b2, 3b3. Это означает замену ‘a’ на ‘b’ в этих именах файлов.
Я попробовал команду, подобную:
for f in */*; do
mv "$f" "${f/a/b}"
done
ls | xargs -i mv {} ${{}/a/b}
ls | xargs -i mv {} `echo {}|tr -t 'a' 'b'`
но ни один из них не работает.
Я знаю команду
переименовать ‘a’ в ‘b’ *
может работать.
Но я все еще хочу выяснить, как использовать for
, xargs
связанные с other cmds
для выполнения этой работы. В конце концов, в повседневном использовании они гораздо более общие, чем простые rename
команды.
Пожалуйста, помогите мне, спасибо.
Комментарии:
1. Это ровно 3 символа? или
a
может быть в любом положении?2. Для начала « не является допустимым разделителем путей, и вам нужно заключить ваши переменные в кавычки.
3. да, я их исправил.
Ответ №1:
#!/bin/bash
for old in *
do new=$(echo "$old" | sed -e 's/a/b/')
echo mv "$old" "$new" amp;>2
mv "$old" "$new"
done
Этот пример позволит вам угадать более сложные преобразования имен, когда вы узнаете, как использовать sed(1)
команду для выполнения преобразований имен.
Программа передает все параметры командной строки в цикл for, в каждом цикле программа получает новую переменную new
с преобразованием исходного $old
имени. Затем вам нужно только выполнить команду со старым и новым значениями.
Ответ №2:
На всякий случай, если вы хотите знать, с переименованием:
rename 's/(.*)a(.*)/$1b$2/' *
Комментарии:
1. Проблема с
rename
заключается в том, что существует несколько разных версий, каждая из которых имеет довольно различный, иногда ограниченный набор функций.