Skip to content
Advertisement

How to grep for a pattern in the files in tar archive without filling up disk space

I have a tar archive which is very big ~ 5GB.

I want to grep for a pattern on all files (and also print the name of the file that has the pattern ) in the archive but do not want to fill up my disk space by extracting the archive.

Anyway I can do that?

I tried these, but this does not give me the file names that contain the pattern, just the matching lines:

JavaScript

Also where is this feature of tar documented? tar xf test.tar $FILE

Advertisement

Answer

Here’s my take on this:

JavaScript

Broken out for explanation:

  • while read filename; do — it’s a loop…
  • tar -xOf file.tar "$filename" — this extracts each file…
  • | grep 'pattern' — here’s where you put your pattern…
  • | sed "s|^|$filename:|"; – prepend the filename, so this looks like grep. Salt to taste.
  • done < <(tar -tf file.tar | grep -v '/$') — end the loop, get the list of files as to fead to your while read.

One proviso: this breaks if you have OR bars (|) in your filenames.

Hmm. In fact, this makes a nice little bash function, which you can append to your .bashrc file:

JavaScript
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement