Скопируйте несколько файлов из нескольких каталогов с новым именем файла - PullRequest
0 голосов
/ 10 мая 2018

Я хочу сделать конкретную копию. Я объясняю

Так вот моя главная папка:

Sub-Directory-name-01\filename-01.jpg
Sub-Directory-name-01\filename-02.jpg
Sub-Directory-name-01\filename-03.jpg
Sub-Directory-name-01\special-filename-01.jpg

Sub-Directory-name-02\filename2-01.jpg
Sub-Directory-name-02\filename2-02.jpg
Sub-Directory-name-02\filename2-03.jpg
Sub-Directory-name-02\special-filename2-01.jpg


Sub-Directory-name-02\filename2-01.jpg
Sub-Directory-name-02\filename2-02.jpg
Sub-Directory-name-02\filename2-03.jpg
Sub-Directory-name-02\special-filename2-01.jpg

Я хочу скопировать весь файл из всех директорий и:
- сохранить оригинальный файл
- 2 раза скопировать оригинальный файл
- добавить префикс к новому имени
- префикс-01 для первого экземпляра
- префикс-02 для второго экземпляра
- сохранить новые файлы в том же каталоге, что и исходный файл

Мне уже все удалось с командой, чтобы скопировать 1 раз с 1 префиксом. Работает в подкаталоге

for file in *.jpg; do cp "$file" "prefix-$file"; done

Я пытаюсь сделать для всех подкаталогов, но я получил ошибку

find . -type f \( -iname "*.jpg" ! -iname "special-*.jpg" \) | xargs cp -v "$file" "prefix-$file"

(да, я исключаю специальное имя)

Но я получил ошибку:

cp: target `./Sub-Directory-name-01/filename-01.jpg' is not a directory

Я не знаю, как решить мою проблему и как добавить 2-ую копию в cmd.

Спасибо

Редактировать: Я не нашел ни одного подобного вопроса, поэтому любой ответчик, чтобы решить эту проблему.

1 Ответ

0 голосов
/ 10 мая 2018

Обратите внимание, что выше $file устанавливается только в цикле for file in ... ; do ... ;done, т. Е. В вашей строке xargs вы только что использовали последнее оставшееся значение из цикла.

Некоторые вещи, которые следует учитывать:

  • необходимо обрабатывать каждый файл отдельно => использовать xargs -l1 (обрабатывать каждую 1 строку).

  • необходимо отделить DIR/FILENAME, так как необходимая команда выглядит примерно так: 'cp $ DIR / $ FILENAME $ DIR / prefix-01- $ FILENAME' (и также prefix-02), используйте для этого find ... -printf "%h %f\n"

  • для каждой строки, необходимо выполнить несколько действий (prefix-01,02) => использовать скриптлет через sh -c '<scriptlet>'

  • лучше пропустить prefix-0?-*.jpg файлы из find, чтобы иметь возможность перезапустить его без "накопления" копий

Возможная реализация будет:

find . -type f \( -iname "*.jpg" ! -iname "special-*.jpg"  ! -name "prefix-0?-*.jpg" \) -printf "%h %f\n" | \
xargs -l1 sh -c 'cp -v "$1/$2" "$1/prefix-01-$2"; cp -v "$1/$2" "$1/prefix-02-$2"' --

Когда xargs запускает sh -c '<scriptlet>' -- DIR FILE для каждой строки, скриптлет будет правильно оценивать $1 и $2 соответственно.

- jjo

PS: разделитель каталогов в Unix-подобных системах равен /:)

[Обновление: исправлено использование %f вместо %P, как указано в комментариях ниже]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...