シェルスクリプトbashで部分文字列を確認するには?

シェルスクリプトbashで部分文字列を確認するには?

実際、文字列はnew.tar.gzです。このファイルがtarballであることを確認したいと思います。

答え1

fileコマンドを使って確認してください。

$ file new.tar.gz
new.tar.gz: gzip compressed data, last modified: Tue Sep 26 16:50:00 2017, from Unix

圧縮されたファイルの内容を調べるには、解凍してfileを実行する必要があります。

$ gunzip -k new.tar.gz; file new.tar
new.tar: POSIX tar archive (GNU)

答え2

技術的にtarアーカイブファイルを呼び出すことができます。何もない。 Unixでは、ファイル名はファイルの形式や内容を決定しません。

$filenameただし、変数etherのファイル名が.tar文字列で終わるかどうか、または文字列が含まれていることを確認することで問題を制限すると、次のようになります.tar.

case $filename in
    *.tar|*.tar.*) echo 'possibly a tar file' ;;
esac

上記は、.tar名前の末尾または.tar他の拡張子が後に続くことを可能にします。

またはbash(上記は以下をsh含むすべてのシェルで機能しますbash):

if [[ $filename =~ \.tar$  ]] ||
   [[ $filename =~ \.tar\. ]]; then
    echo 'possibly a tar file'
fi

または、

if [[ $filename == *.tar   ]] ||
   [[ $filename == *.tar.* ]]; then
    echo 'possibly a tar file'
fi

ファイルに長いファイル名のリストが含まれている場合は、次の内容からファイル名が何であるかを確認できます。ファイルの行.tar文字列で終わるか、次の文字列を含めます.tar.

grep -E '\.tar$|\.tar\.' file.list

この-Eフラグは、grep指定されたパターンを拡張正規表現(処理用|)として処理するように指示します。

または、

grep -e '\.tar$' -e '\.tar\.' file.list

リスト決定的な長いリストの各ファイルの拡張子(に保存されていますfile.list):

sed 's/.*\.//' file.list

このsed式は、s/.*\.//最後のポイントまで各行のすべての内容を削除します。

関連情報