Я пытаюсь переименовать большое количество файлов с неправильными именами, которые отслеживаются в моем локальном репозитории git. Файлы в настоящее время имеют вид foo.txt_1.txt
. И я хочу изменить их на foo.txt
.
Это то, с чем я экспериментировал до сих пор:
ls *_1.txt | xargs -I {} git mv -n {} newfilename
Я просто не уверен, что мне следует использовать вместо newfilename
, чтобы сделать замену, которую я хочу.
Это проще с циклом for вокруг него.
for f in *_1.txt; do
echo git mv $f ${f/_1.txt/}
done
Это будет повторять команды, которые он будет запускать, чтобы вы могли проверить их правильность. Удалите «echo» перед командой «git», чтобы выполнить ее.
Встроенная замена Bash работает следующим образом:
${VAR/_1.txt/}
Где VAR
— имя переменной, а удаляемый шаблон находится между /
s. Здесь это просто текст, но здесь вы можете использовать регулярные выражения.
А как насчет mv $f ${f/_1.txt/}
?
Мне лично нравится генерировать несколько команд (используя именно такую технику), но просто сохранять их в файл: for f in ... done > /tmp/doit.sh
. Затем я открываю файл в редакторе, проверяю его на правильность, смотрю, есть ли что-то, что легко исправить, если что-то не так, и затем sh /tmp/doit.sh
, если это правильно. Та же общая идея, но иногда я просто ls *_1.txt > /tmp/doit.sh
редактирую это в команды, которые хочу!
@Philippe вау ... как я этого не понял ... Я обновил свой ответ, включив это - спасибо!
Я обновил свой ответ, чтобы он был немного проще (и не выполнял sed для каждой строки) благодаря отзывам Филиппа в комментариях.