Unix: encontre nomes de arquivos de diretórios listados em um arquivo de texto e mova para o novo diretório

1

Sou um novato em linha de comando tentando descobrir o comando apropriado para executar o seguinte no Terminal no Mac OS X.

Supondo que coloquei todos os arquivos no mesmo diretório, quero isolar e mover um conjunto selecionado de arquivos de diretório listados em um arquivo de texto para um novo diretório, como faço para:

  • leia a lista selecionada de nomes de arquivos listados em um arquivo .txt

  • encontre todas as correspondências por nome de arquivo

  • isole e mova todas as correspondências de arquivo para um novo diretório

Eu encontrei este comando para encontrar (um ou ambos) um filestring.filetype em um diretório atual e mover todas as correspondências para um novo diretório:

find . -type f -iname "filestring.filetype" -print0 |
  xargs -0 -J % mv % ~/NewDirectory/

E eu encontrei este comando tar no entanto, ele cria uma cópia arquivada de cada nome de arquivo listado em filename.txt

tar -cf - -T filename.txt | (cd /path/to/new/dir && tar -xvf -)

Qualquer ajuda é muito apreciada!

A seguinte solução foi fornecida por uma fonte confiável:

cat "filename.txt" | xargs -I % mv % ~/NewDirectory/
    
por user2055921 08.02.2013 / 23:15

2 respostas

1

Você poderia tentar isso. Trabalha com o bash.

while read file
do
    mv -v -i "$file" ~/NewDirectory/
done < listoffiles.txt
    
por 09.02.2013 / 00:14
0

A solução find ... xargs que você sugeriu funciona para mim usando Bash version 3.2.48(1)-release no Mac OS X 10.6.8.

mkdir -v -p ~/NewDirectory
find . -type f -maxdepth 1 -iname "*.pdf" -print0 |
   xargs -0 -J % mv -i -v % ~/NewDirectory

Se você for usar um arquivo de texto contendo os caminhos completos dos arquivos a serem movidos, certifique-se de que cada caminho de arquivo armazenado no arquivo de texto seja terminado por um byte nulo. Dessa forma, até mesmo caracteres de nova linha nos seus caminhos de arquivo não serão motivo de preocupação para você no futuro.

# some tests
mkdir -v -p ~/NewDirectory
find "${PWD}" -type f -maxdepth 1 -print0 > listoffiles.txt
xargs -0 -n 1 ls -l <listoffiles.txt
# use a grep regex filter on file paths
grep -az 'bash' listoffiles.txt | xargs -0 -n 1 ls -l  
xargs -0 -n 1 sh -c 'echo mv -v -i "$1" ~/NewDirectory' _ <listoffiles.txt
xargs -0 -J % ls -ld % ~/NewDirectory <listoffiles.txt
xargs -0 -J % mv -i -v % ~/NewDirectory <listoffiles.txt

Para depurar seu código em Bash use:

#help set
set -Eeuxv -o pipefail +H   # for debugging
trap 'printf "%s\n" "$?"; trap - EXIT' EXIT HUP INT QUIT PIPE TERM ERR
    
por 11.02.2013 / 14:21

Tags