Linux: executa o comando em cada arquivo copiado

0

Qual é a melhor maneira de copiar arquivos para um novo local enquanto executa um comando em cada arquivo copiado? Espera-se que as pastas copiadas tenham subdiretórios.

Por exemplo, você pode estar fazendo um cp -R para um compartilhamento ou rsync para backup e deseja:

  • reencode vídeos: ffmpeg -i $source -c:v libx264 -crf 23 -c:a copy $destination
  • compactar para arquivamento: gzip -9 $source
  • criptografar para transporte: gpg -e -r [email protected] $source
  • copie somente cabeçalhos para visualização: head -n 10 $source > $destination
  • ou até mesmo vários comandos em cadeia
por goweon 30.09.2018 / 23:36

1 resposta

0

O primeiro passo seria copiar a estrutura do diretório:

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

Pode haver mais coisas que você deseja fazer, por exemplo copiar permissões:

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

(Nota: --reference não é exigido pelo POSIX).

Ou, em vez de mkdir , você pode usar cp -a --attributes-only (também não POSIX):

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

remova todos os não diretórios de $tdir , deixando a estrutura de diretórios vazia:

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

Agora, quando você tiver a estrutura de diretório de destino, trabalhe com os arquivos. Se você não precisa de pipes, redirecionamentos, etc., esta abordagem de exemplo serve:

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

Se você precisar de canos ou redirecionamentos, precisará de um shell para lidar com eles:

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

A execução de um shell separado para cada arquivo é lenta, mas permite que você faça praticamente qualquer coisa.

    
por 01.10.2018 / 01:01