Como encontrar um arquivo que corresponda a um padrão e data específicos ao copiar cada arquivo encontrado para o diretório de outro servidor da web?

0

Estou usando o Bourne Shell: #!/bin/sh

Estou fazendo um script que encontra um arquivo / s que corresponde a um padrão específico e enquanto o comando está sendo executado, copie cada saída para um novo diretório.

myscript.sh

#!/bin/sh

ssh user@hostname find /path/to/find/file* -mtime 10 | while read -r LINE
do
scp -r user@hostname:$LINE /path/to/destination/
done

Esse é o meu script inicial para encontrar os arquivos com o mesmo padrão de nome de arquivo, mas há alguns outros arquivos que não têm o mesmo padrão de nome de arquivo. Então eu decidi usar grep e pipe para encontrar, mas ele não lê o ssh mais, em vez disso, ele encontra os arquivos no diretório atual que claramente não existem.

Veja um exemplo:

ssh user@hostname find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find' | while read -r LINE
do
    scp -r user@hostname:$LINE /path/to/destination/
done

Veja que eu queria usar este comando find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find' , mas quando eu o incorporar com um tempo usando | ele não funciona mais.

    
por WashichawbachaW 15.11.2017 / 04:29

2 respostas

1

Não use find com xargs piping. Se você fizer isso, tente usar com find -print0 e xargs -0 para usar o caractere nulo em vez de novas linhas como o nome do arquivo.

De man find :

-print0

True; print the full file name on the standard output, followed by a null character (instead of the newline character that -print uses). This allows file names that contain newlines or other types of white space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

Então, o seu comando será:

ssh user@hostname find /path/to/find/ -type f -mtime 10 -print0 | xargs -0 zgrep -il 'pattern_to_find'

Mas -print0 não é POSIX (se não me engano). Assim, existe apenas um caminho, leia abaixo.

Ou a melhor maneira de usar a opção -exec do comando find sem xargs piping:

ssh user@hostname find /path/to/find/ -type f -mtime 10 -exec grep -il 'set' {} + ;

Veja Como posso pesquisar recursivamente todos os arquivos em busca de uma string?

    
por 15.11.2017 / 07:22
0
ssh -n user@hostname 'find /root/git/ -mtime 10 | while read -r LINE ; do echo $LINE; done'
Opção

-n de man ssh :

-n Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. # ... # The ssh program will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the -f option.)

EDITADO

OK, então os nomes dos arquivos find devem ser ecoados (como strings) para xargs para passar como um argumento para grep / zgrep, confira (no -print0 necessário):

ssh user@hostname find /path/to/find/* -mtime 10 | xargs echo | zgrep -i 'pattern_to_find' | while read -r LINE do scp -r user@hostname:$LINE /path/to/destination/ done

    
por 15.11.2017 / 05:29