Tenho um diretório de muitos arquivos, algo como 50.000 pdf's e outros arquivos em um servidor. Eu preciso mover os específicos para outro diretório. Posso gerar uma lista dos arquivos que precisam ser movidos em csv ou em qualquer outro formato de texto.
O que 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.
Para evitar um uso inútil de
cat
(e se você não usarrsync
):Isso manipulará qualquer nome de arquivo válido, a menos que contenha uma nova linha, se os arquivos estiverem listados um por linha.
O rsync tem várias opções que podem levar uma lista de arquivos para processar (
--files-from
,--include-from
, etc.).Por exemplo, isso fará o truque:
assumindo bash, além de
listoffiles
conter um arquivo por linha. Minha única objeção à rota rsync é que o OP solicita um método de mover os arquivos, não copiá-los. rsync tem mais bandeiras do que um casamento real, então tenho certeza que pode ser modificado para fazer isso, mas às vezes mais simples é melhor!O Rsync tem o benefício adicional sobre os comandos
cp
oumv
porque criará pastas automaticamente se elas não existirem.Isso depende do formato do arquivo de texto que você possui. Por exemplo, se você tiver a lista de arquivos gravada de forma que Cada arquivo esteja localizado em uma nova linha. Você pode usar xargs como:
Além disso, você pode usar
find
o comando com-exec
opção. para copiar/mover os arquivos.Se (e somente se), você não tiver nenhum caractere desagradável nos nomes dos arquivos (espaços, novas linhas, o que confundiria os xargs sobre como dividir as coisas em argumentos individuais) e gerar uma lista de arquivos separados por novas linhas (um arquivo por linha), você poderia fazer algo como.
(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
Nota - nenhum deles funcionará como esperado se houver nomes de arquivos com novas linhas neles.
Acho que a resposta do rsync é melhor, mas apenas para outra opção:
Tente algo como:
Copiei acidentalmente o conteúdo completo de um diretório em 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 ser 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, ordenado inversamente por hora, ou seja, do mais antigo para o mais novo.Então eu criei um subdiretório do diretório de destino agora desordenado para mover as coisas.
mkdir /path/to/cluttered/destination/directory/newsubdirectory
Então eu repeti a listagem do diretório, exceto listar na tela e mostrar mais detalhes.
ls -lrht /path/to/cluttered/destination/directory/
Esta linha lista o diretório, ordenado por data crescente (ordenação reversa 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 eles estavam. Haverá uma lacuna no carimbo de data/hora dos arquivos onde todos os novos arquivos começam que não deveriam estar lá.Então eu editei o arquivo filestomove criado no primeiro passo acima (que está ordenado por data) e apaguei os poucos da lista que estavam lá anteriormente que eu quero ficar do diretório original.
vim /opt/dircheck/filestomove
Exclua do topo todos os arquivos que você não deseja mover.Então usei o comando listado anteriormente neste post para mover os arquivos da minha lista para o novo diretório que criei.
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 início, isso é uma questão de permissões de arquivo).
Agora meu diretório de destino original é bom e limpo e contém um novo diretório com todos os arquivos e diretórios que o estavam sobrecarregando.
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 de diretórios:
Como o RSYNC cria primeiro o espelho da estrutura de diretórios e depois sincroniza os arquivos, você pode acabar com pastas em excesso vazias. Eu usei o sinalizador --prune-empty-dirs para remover esses diretórios vazios.
Não tenho afiliação, mas achei correto dar crédito à fonte que inspirou esta solução: http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/