Скопируйте несколько файлов с подстановочным знаком в Bash - PullRequest
0 голосов
/ 07 ноября 2019

Использование Ubuntu 18.04. Скажем, у нас есть файл с именем debug.log. Вы можете создать копию с именем debug_BACKUP.log с помощью одной из следующих команд:

cp debug.log debug_BACKUP.log
cp debug{,_BACKUP}.log

Альтернативно, замените cp на mv, чтобы переименовать файл.

Теперь предположим, что у нас есть debug1.log и debug2.log. Мы хотели бы создать копии с именами debug1_BACKUP.log и debug2_BACKUP.log. Есть ли одна команда для достижения этой цели?

Когда я попытался выполнить одно из следующих действий:

cp debug*.log debug*_BACKUP.log
cp debug*{,_BACKUP}.log

ошибка cp: target 'debug*_BACKUP.log' is not a directory.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Расширения скобок - это инструкция для оболочки о том, как переписать вашу команду до того, как произойдет расширение глоба. Они не передаются самой команде - cp не знает, использовалось ли расширение скобок. В этом отношении cp даже не подозревает, используется ли подстановочный знак;когда вы запускаете cp *.txt dir/, оболочка генерирует массив строк C, соответствующих чему-то вроде cp foo.txt bar.txt baz.txt dir/ перед его запуском.

Это означает, что если вы хотите переписать содержимое после расширения с использованием подстановочных знаков, вам необходимосделай это вручную.

for f in debug*.log; do
  [[ $f = *_BACKUP.log ]] && continue # skip things that are already backup files
  cp "$f" "${f%.log}_BACKUP.log"
done
0 голосов
/ 07 ноября 2019

Существует несколько превосходных программ массового переименования, включая Perl-переименование файлов. Вы можете получить массовое копирование в 3 этапа:

  1. Скопировать файлы в подпапку tmp
  2. Выполнить массовое переименование, переместив файлы обратно в текущую папку
  3. Удалить папку tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...