Каков наилучший способ скопировать файлы в новое место при выполнении команды для каждого скопированного файла? Предполагается, что скопированные папки будут иметь подкаталоги.

Например, вы можете сделать cp -R для общего ресурса или rsync для резервного копирования, и вы хотите:

  • перекодировать видео: ffmpeg -i $source -c:v libx264 -crf 23 -c:a copy $destination
  • Сжать для архивирования: gzip -9 $source
  • шифровать для транспорта: gpg -e -r USER@example.com $source
  • для предварительного просмотра скопируйте только заголовки: head -n 10 $source > $destination
  • или даже цепочка нескольких команд

1 ответ1

0

Первым шагом было бы скопировать структуру каталогов:

sdir="/path/to/source/dir"
tdir="/path/to/target/dir"
cd "$sdir"
find . -type d -exec mkdir -p "$tdir"/{} \;

Вы можете сделать больше, например, разрешения на копирование:

find . -type d -exec chmod --reference={} "$tdir"/{} \;

(Примечание: - --reference не требуется для POSIX).

Или вместо mkdir вы можете использовать cp -a --attributes-only (также не POSIX):

# this assumes $tdir doesn't yet exist but its future parent does
cp -a "$sdir" "$tdir"

затем удалите все не-каталоги из $tdir , оставив пустую структуру каталогов:

# make sure "$tdir" is what it should be
find "$tdir" ! -type d -delete

Теперь, когда у вас есть целевая структура каталогов, работайте с файлами. Если вам не нужны каналы, перенаправления и т.д., Этот примерный подход подойдет:

cd "$sdir"
find . -type f -exec ffmpeg -i {} -c:v libx264 -crf 23 -c:a copy "$tdir"/{} \;
#                       source ^^                         target ^^^^^^^^^^

Если вам нужны каналы или перенаправления, вам понадобится оболочка для их обработки:

cd "$sdir"
find . -type f -exec sh -c 'head -n 10 "$1" >"$2"/"$1"' sh-find     {}    "$tdir" \;
#                                  for sh these are  $0:^^^^^^^, $1:^^, $2:^^^^^

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

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