Мне интересно, есть ли способ переименовать широкий спектр файлов, которые найдены с использованием шаблонов подстановочных знаков. Например, я хочу scp все файлы, которые соответствуют определенному шаблону, но добавить строку к именам файлов в определенной точке. Что-то вроде этого:

ДИСТАНЦИОННЫЙ ПУЛЬТ:

hello.txt
help.txt
heroes.txt

Я ХОЧУ МЕСТНО:

hello_copy.txt
help_copy.txt
heroes_copy.txt

Очевидно, scp user@remote_host:~/he*.txt ./he*_copy.txt не работает. Мне интересно, если это возможно, или мне нужно копировать каждый файл в отдельности.

В идеале я ищу решение, которое работает в bash, чтобы я мог делать то же самое с mv , cp и т.д.

1 ответ1

3

К сожалению, подстановочные знаки довольно ограничены. Но это можно сделать с помощью пары дополнительных команд. Во-первых, вы можете перебирать файлы с помощью 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/ :-)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .