Shell command to filter out non-existing files in a pipe

backuptar

I'm looking for a nice way to generate a backup tar.gz of what is going to be overridden by the extraction of another tar.gz.

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

This works perfectly! However, sometimes, the new patch (patch.tar.gz) will not only contain files already existing in the HDD, but also may add new files which don't already exist.
These files which don't exist will be impossible to backup, and the second tar will generate an error. The exit code is 2.

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

I'm looking for shell command which only checks for file existence (stdin) et send existing files on stdout. Does it exist? I would need something like this:

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

I need one shell command and not a shell script.
Obviously, I could implement this shell command in C myself, because it's very simple, but I hope to find something generic which will be found on other UNIX platforms.

Best Answer

Try use perl oneliner for this

like

cat filelist | perl -ne 'chomp(); if (-e $_) {print "$_\n"}' | tar -T- -zcvf backup.tar.gz
Related Topic