К сожалению, подстановочные знаки довольно ограничены. Но это можно сделать с помощью пары дополнительных команд. Во-первых, вы можете перебирать файлы с помощью for
:
bash$ ls -1
hello.txt
help.txt
heroes.txt
bash$ for f in *; do echo "$f"; done
hello.txt
help.txt
heroes.txt
Вы также можете выполнить начальную фильтрацию, используя *.txt
вместо *
. Убедитесь в том, что переменная заключена в кавычки, чтобы пробелы или специальные символы в именах файлов не нарушали команду.
Теперь вы можете заменить строку на другую с помощью sed
(обратная косая черта необходима, потому что точка имеет специальное значение без нее, а знак доллара после нее означает "конец строки"):
bash$ for f in *; do echo "$f" | sed s/\.txt$/_copy.txt/; done
hello_copy.txt
help_copy.txt
heroes_copy.txt
Вы можете легко превратить это в команду. Например, mv
(давайте сначала посмотрим, как это выглядит с дополнительным echo
):
bash$ for f in *; do echo mv "$f" `echo "$f" | sed s/\.txt$/_copy.txt/`; done
mv hello.txt hello_copy.txt
mv help.txt help_copy.txt
mv heroes.txt heroes_copy.txt
Все выглядит хорошо, поэтому давайте сделаем это по-настоящему сейчас:
bash$ for f in *; do mv "$f" `echo "$f" | sed s/\.txt$/_copy.txt/`; done
bash$ ls -1
hello_copy.txt
help_copy.txt
heroes_copy.txt
Вы даже можете отменить переименование, используя sed s/_copy\.txt$/.txt/
:-)