Comando shell para filtrar arquivos não existentes em um pipe

5

Estou procurando uma maneira legal de gerar um backup tar.gz do que será substituído pela extração de outro tar.gz.

tar -ztf patch.tar.gz | grep -v "/$" | tar -T- -zcvf backup.tar.gz

Isso funciona perfeitamente! No entanto, às vezes, o novo patch (patch.tar.gz) não só contém arquivos já existentes no disco rígido, mas também pode adicionar novos arquivos que ainda não existem. Esses arquivos que não existem serão impossíveis de backup, e o segundo tar irá gerar um erro. O código de saída é 2 .

tar: folder/file.txt: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous error

Estou procurando pelo comando shell que apenas verifica a existência de arquivos (stdin) e envia arquivos existentes no stdout. Existe? Eu precisaria de algo assim:

tar -ztf patch.tar.gz | grep -v "/$" | filterfileexist | tar -T- -zcvf backup.tar.gz

Eu preciso de um comando shell e não de um shell script.
Obviamente, eu poderia implementar este comando shell em C, porque é muito simples, mas espero encontrar algo genérico que possa ser encontrado em outras plataformas UNIX.

    
por Fox 03.07.2014 / 16:35

2 respostas

1

Tente usar o perl oneliner para isso

como

cat filelist | perl -ne 'chomp(); if (-e $_) {print "$_\n"}' | tar -T- -zcvf backup.tar.gz
    
por 03.07.2014 / 17:05
3

Aqui estão algumas alternativas.

tar -ztf patch.tar.gz | grep -v "/ $" | xargs -i sh -c 'teste -f {} & & echo {} '| tar -T- -zcvf backup.tar.gz

ou

tar -ztf patch.tar.gz | grep -v "/ $" | tar --ignore-failed-read -T- -zcvf backup.tar.gz

O segundo exemplo sairá com o status zero após uma tentativa de backup de um arquivo que não existe (testado no Centos 6.5), o que evita o problema.

    
por 03.07.2014 / 17:10

Tags