Arquivos específicos do Linux (mv ou cp) de uma lista de arquivos de texto?

28

Eu tenho um diretório de muitos arquivos, algo como 50.000 arquivos pdf e outros em um servidor. Eu preciso mover os específicos para outro diretório. Eu posso gerar uma lista dos arquivos que precisam ser movidos em csv ou qualquer outro formato de texto.

O que eu preciso fazer é executar um script bash e mover ou copiar os arquivos listados no arquivo de texto para outro diretório.

Existe uma maneira fácil de fazer isso? Quaisquer sugestões ou recursos seriam muito apreciados.

    
por Jestep 14.12.2010 / 15:07

10 respostas

20

O rsync tem várias opções que podem levar uma lista de arquivos para processar ( --files-from , --include-from , etc.).

    
por 14.12.2010 / 15:15
22

Para evitar o uso inútil de cat (e se você não usa rsync ):

xargs -a file_list.txt mv -t /path/to/dest

Isso manipulará qualquer nome de arquivo válido, a menos que contenha uma nova linha, se os arquivos forem listados um por linha.

    
por 14.12.2010 / 16:02
15
for file in 'cat listoffiles'; do mv "$file" /path/of/destination ; done

assumindo bash, mais listoffiles contendo um arquivo por linha. Minha única objeção à rota rsync é que o OP pede um método de mover os arquivos, não copiá-los. O rsync tem mais bandeiras do que um casamento real, então tenho certeza que ele pode ser modificado para fazer isso, mas às vezes é mais simples!

    
por 14.12.2010 / 16:12
3

Isso depende do formato do arquivo de texto que você possui. Por exemplo, se você tiver a lista de arquivos gravados de forma que cada arquivo esteja localizado em uma nova linha. Você pode usar xargs como:

$ cat your_text_file | xargs cp -t /path/to/destination

Além disso, você pode usar o comando find com a opção -exec . para copiar / mover os arquivos.

    
por 14.12.2010 / 15:35
1

Acho que a resposta do rsync é melhor, mas apenas para outra opção:

tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)
    
por 14.12.2010 / 15:26
1

Eu acidentalmente copiei o conteúdo completo de um diretório para um diretório de destino em vez de mover o diretório completo. Isso resultou em um diretório de destino desordenado, em vez do diretório de origem que está sendo adicionado ao diretório.

Para corrigir isso, fiz o seguinte:

ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove O comando acima cria o arquivo filestomove que será uma lista de todo o conteúdo do diretório de destino, invertido classificado por hora, significando o mais antigo para o mais recente.

Em seguida, criei um subdiretório do agora desordenado diretório de destino para mover o material.

mkdir /path/to/cluttered/destination/directory/newsubdirectory

Em seguida, repeti a listagem do diretório, exceto listar para a tela e mostrar mais detalhes.

ls -lrht /path/to/cluttered/destination/directory/ Esta linha lista o diretório, classificado por data crescente (classificação inversa por hora) e mostra mais informações, incluindo o carimbo de data / hora de cada arquivo no diretório de destino agora desordenado. Refiro-me a isso, começando no topo para mostrar quais diretórios e arquivos eu quero manter onde estavam. Haverá uma lacuna no registro de data / hora dos arquivos em que todos os novos arquivos iniciam e que não deveriam estar lá.

Em seguida, editei o arquivo filestomove criado na primeira etapa acima (que é classificado por data) e excluí os poucos da lista que estavam lá anteriormente e desejo permanecer no diretório original.

vim /opt/dircheck/filestomove Exclua da parte superior todos os arquivos que você não deseja mover.

Então eu usei o comando listado anteriormente neste post para mover os arquivos da minha lista para o novo diretório que eu fiz.

sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory

Isso moveu todos os arquivos em uma fração de segundo. (Nota: você pode não precisar do sudo no começo, isso é uma questão de permissões de arquivo).

Agora, meu diretório de destino original é legal e limpo e contém um novo diretório com todos os arquivos e diretórios que o estavam bagunçando.

    
por 07.12.2011 / 05:26
1
rsync --files-from=file_list.txt /path/to/source/ /path/to/dest/

O Rsync tem o benefício adicional sobre os comandos cp ou mv porque ele criará pastas automaticamente se elas não existirem.

    
por 17.09.2015 / 21:02
0

Se (e somente se), você não tiver nenhum caractere desagradável nos nomes de arquivos (espaços, novas linhas, o que confundirá os xargs sobre como dividir as coisas em argumentos individuais), e você gerará uma lista de arquivos separados por novas linhas (um arquivo por linha), você poderia fazer algo assim.

cat filenames.txt | xargs mv -t /path/to/move/files/to

(Em geral, veja man xargs , é incrível)

Se o seu mv em particular não tiver a opção -t, você também pode fazer alguns truques como

( cat filenames.txt; echo /path/to/move/files/to ) | xargs mv
    
por 14.12.2010 / 15:16
0

Tente algo como:

cat list.txt | while read line; do mv "$line" /images; done
    
por 14.12.2010 / 15:16
0

O seguinte funcionou para mim, onde eu precisava copiar todos os arquivos PNG de um caminho específico (e todos os subdiretórios) para um novo local, preservando a estrutura do diretório:

rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/

Como o RSYNC cria o espelho da estrutura de diretórios primeiro e, em seguida, sincroniza os arquivos, você pode acabar com pastas em excesso que estão vazias. Eu usei o sinalizador --prune-empty-dirs para remover esses diretórios vazios.

Não tenho afiliação, mas achei certo dar crédito à fonte que inspirou essa solução: link com -rsync / ">

    
por 26.07.2012 / 23:47