Relocalize os arquivos jpg da estrutura aninhada / enterrada para os diretórios conhecidos relativos

0

Estou tentando mover / organizar em lote um grande número de arquivos (.jpg) de subdiretórios aninhados para um diretório relativo. A estrutura é pré-planejada. Apenas não tenha 100% de certeza de qual é a maneira mais eficiente e segura de fazê-lo.

Estrutura da amostra:

/directory/subdir/jpg/
/directory/subdir/source/something.jpg
/directory/subdir/source/something.tif
/directory/subdir/source/something-else.jpg
/directory/subdir/source/something-else.tif
/directory/subdir/source/another-file.jpg
/directory/subdir/source/another-file.tif
/directory/another-subdir/jpg/
/directory/another-subdir/source/yet-another-file.jpg
/directory/another-subdir/source/yet-another-file.tif

O objetivo é fazer com que isso aconteça ...

/directory/subdir/jpg/something.jpg
/directory/subdir/jpg/something-else.jpg
/directory/subdir/jpg/another-file.jpg
/directory/subdir/source/something.tif
/directory/subdir/source/something-else.tif
/directory/subdir/source/another-file.tif
/directory/another-subdir/jpg/yet-another-file.jpg
/directory/another-subdir/source/yet-another-file.tif

Eu pensei em algo assim. Só não tenho certeza se vai brindar minha estrutura. Estamos falando de dezenas de shows de dados e milhares de arquivos que são críticos para a organização de nossos clientes.

find /directory -name \*.jpg -exec mv {} ../jpg/ \;

Se houver alguma forma de "execução a seco" que qualquer pessoa possa saber sobre o que eu possa usar para testar visualmente antes de realmente executar, isso seria incrível. Obrigada!

ATUALIZAÇÃO:

Na verdade, estou tentando fazer a mesma coisa localmente no meu Mac e recebendo este erro. Quaisquer soluções inteligentes?

$ find -name "*.jpg" -execdir pwd \; -execdir echo mv -v '{}' ../jpg \;
find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
    
por Will Ashworth 16.07.2014 / 18:18

1 resposta

2

Você pode fazer uma corrida seca simplesmente incluindo echo :

find /directory -name \*.jpg -exec echo mv {} ../jpg/ \;

Mas isso não fará o que você quer, já que ../jpg é sempre avaliado no diretório atual, portanto, moveria todas as imagens jpg para $PWD/../jpg .

Isso deve funcionar como esperado:

find /directory -name "*.jpg" -execdir pwd \; -execdir echo mv -v '{}' ../jpg \;

porque -execdir é

like -exec, but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find. This a much more secure method for invoking commands, as it avoids race conditions during resolution of the paths to the matched files.

Mas é claro que "Estamos falando de dezenas de gigabytes de dados e milhares de arquivos que são críticos para a organização de nossos clientes." , sempre tenha um backup atualizado em mão ...

    
por 16.07.2014 / 18:56

Tags