localizar e copiar arquivos usando a lista de entrada e caminhos de arquivo parciais

1

Eu tenho uma lista de nomes de arquivos names.list que contém apenas nomes. Esses arquivos estão espalhados pelo meu sistema em várias subpastas, mas a estrutura é geralmente

uniquename/uniquename2/spades/filtered/filename

A constante é spades/filtered

Eu usei os seguintes comando ao mover arquivos de um diretório

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

E eu vi esse segmento usando nome do arquivo curinga / parcial s

find . -path \*content/docs/file.xml

E eu tentei combiná-los assim

find . -path \*spades/filtered/ | xargs -a names.list cp -t $HOME/destination/

Mas recebo o seguinte erro:

cp: cannot stat 'filename': No such file or directory

tldr: Eu quero copiar arquivos usando e inserir lista apenas de nomes e caminho de arquivo parcial

    
por AudileF 18.07.2017 / 12:10

2 respostas

1

Espero que isso ajude agora: Percorra os nomes dos arquivos por meio de um loop for e anexe-os ao padrão de localização, copie com o manipulador exec:

for i in $(<names.list)
do
    find . -path \*spades/filtered/"$i" -type f -exec cp -t "$HOME/destination/" {} \;;
done

Editar : Graças à resposta de Rakesh Sharma, substituindo o corpo do loop por:

find . -mindepth 5 -maxdepth 5 -path "*/spades/filtered/$i" -type f -exec cp -t "$HOME/destination/" {} +;

acelera as coisas.

    
por 18.07.2017 / 13:27
0

Você pode acabar com o loop for e fazer tudo em xargs :

xargs -a names.list -L 1 -I @ find . -path \*/spades/filtered/@ -type f -exec cp -fpvt "$HOME/destination/" {} +

Assumindo utilitários GNU xargs, find e cp.

-a lerá o nome do arquivo uma linha por vez.

A opção

-L 1 faz com que xargs passe um argumento separado por nova linha para encontrar.

A opção

-I @ condensará esse argumento no símbolo @ , que pode estar preso no utilitário chamado por xargs , nesse caso, find . Mais especificamente, a opção -path de find é modificada pelo símbolo @ para cada linha de nomes.lista lida.

    
por 19.07.2017 / 14:45

Tags