Скопируйте и вставьте кучу файлов с другим именем

10

У меня есть куча текстовых файлов с именем

foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
...
...
foo_bar_abc_1_1000_geh_original.in

Я хотел бы скопировать (и сохранить исходные файлы) каждый файл и вставить под разными именами (в той же папке), как,

foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_03_geh_copy.in
...
...
foo_bar_abc_1_1000_geh_copy.in

Как я могу сделать это, используя простой скрипт?

явление
источник

Ответы:

13

Перейдите в каталог, где находятся исходные файлы.

Затем проверьте с помощью следующей командной строки,

for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done

и если это выглядит хорошо, удалите echoи сделайте копирование,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
sudodus
источник
8

Вы можете использовать mcpиз mmvпакетаУстановить ммв следующим образом:

mcp "*original*" "#1copy#2"

Это скопирует каждый файл, содержащий строку «original» в текущем каталоге, и заменит эту строку на «copy». Вы можете проверить, что mcpбудет делать, добавив -nфлаг, однако он не будет перезаписывать файлы без вывода сообщений, а спросит вас. mmvПреимущество использования заключается в том, cpчто вам не нужно вызывать его для каждого отдельного файла - с тысячей файлов, которые вы, похоже, копируете, это имеет значение.

Вы также можете использовать GNUparallel Установить параллельно следующим образом ( --dry-runдля тестирования удалите его для выполнения копирования):

parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *

или, если это приводит к ошибке «Список аргументов слишком длинный»:

printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"

Пример запуска

$ ls -1
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_original.in
$ mcp "*original*" "#1copy#2"
$ ls -1
foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_copy.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_copy.in
foo_bar_abc_1_04_geh_original.in

Давайте timeзапустим более 1000 файлов по 100 КиБ на медленной машине:

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
Десерт
источник