Using grep to search file exention

Discussion in 'General Computing' started by Kryyll, Mar 13, 2014.

  1. Kryyll

    Kryyll Active Member

    Messages:
    104
    Likes Received:
    35
    Trophy Points:
    28
    I've been trying to write a bash script that searches for any compressed file(.tar, .tar.gz, .zip, etc) and them decompresses for you. However, I can't see to get grep to search for the file extensions. I've tried;
    Code:
    grep *.tar /path/to/stuff
    but no luck. Any ideas?

  2. Snipert

    Snipert New Member

    Messages:
    10
    Likes Received:
    2
    Trophy Points:
    3
    Best Answer
    grep is used to search plaintext files.
    .tar files are not compressed in plain text.

    Try typing-> cat foo.tar
    into a teminal. It'll spit out a bunch of binary info (which it should be)

    To grep a .tar file, try this:
    tar -tf foo.tar | grep searchphrase

    -t lists the content of the .tar file, -f specifies the tar file, | pipes the output (plaintext!) into grep, which then searches it.

    To search for all of them (.tar files) it sounds like you want to take each file, list its contents and grep the results. Sounds like a for loop.

    So I'd do -> for i in *.tar; do tar -tf $i | grep searchterm; done
    Kryyll likes this.
  3. MikeyD

    MikeyD Active Member

    Messages:
    219
    Likes Received:
    105
    Trophy Points:
    43
    Snipert is right, a for loop will be the best way to iterate over them.

    Here is the beginning of a script that may help:
    Code:
    list=`ls | egrep "*.t(gz|ar*)"`  # This will grab all .tar .tar.gz and .tgz files. Need to add an extra condition for .zip though.
    
    for LIST in $list; do
        printf "${LIST}\n" # this will iterate over all the files grepped by the previous command
    done
    
    This obviously only prints out the name of each file. ls can be used if all the files you need are in a specific directory, otherwise you may want to consider using a find command (which has file type options that may be able to fulfill the same purpose, saving you from having to concoct a regular expression)

    In the for loop you'll probably want to use a case statement or if statements to denote the options to send to tar (.tgz and tar.gz files will need to -z option to uncompress versus the standard .tar) you can then un-tar each file individually within the loop.

Share This Page