Usando um loop de shell e chamando find
uma vez para cada nome de arquivo:
mkdir -p archive_dir
while IFS= read -r filename; do
find maindir -type f -name "$filename" -exec mv {} archive_dir ';'
done <listfile.txt
Isso seria um pouco ineficiente, já que continuaria procurando por nomes de arquivos correspondentes, mesmo depois de encontrar o arquivo (e se encontrasse outro, ele sobrescreveria o que já foi movido).
Se estiver usando o GNU find
, você pode adicionar -quit
ao final do comando find
para fazer com que o processo find
pare depois que o primeiro arquivo for movido.
Como funciona:
$ cat listfile.txt
filename1.txt
filename2.txt
.
|-- listfile.txt
'-- maindir
|-- subdir1
|-- subdir2
| '-- filename1.txt
'-- subdir3
'-- filename2.txt
4 directories, 3 files
(executando o loop acima)
Então:
.
|-- archive_dir
| |-- filename1.txt
| '-- filename2.txt
|-- listfile.txt
'-- maindir
|-- subdir1
|-- subdir2
'-- subdir3
5 directories, 3 files
Relacionados: