
次の問題があります。同じフォルダにある拡張子が.jpgの単一ファイルの名前を読み取り、それをアーカイブ名として使用するbashスクリプトを作成したいと思います。
/Sample.jpg
/Sample.7z <--
ls *jpg > OutputFileName
...
7za a Sample.7z ...
この目標をどのように達成できますか?
答え1
単純なシェル引数拡張を使用してこの問題を解決できます。 bash機能は必要ありません。
#!/bin/sh
set -- *.jpg
if [ $# -ne 1 ] || [ "$1" = "*.jpg" ]
then
echo "Error: there is not exactly one .jpg file here"
exit 1
fi
7za a "${1%.jpg}".7z "$1" # ...
スクリプトは、位置パラメータを拡張ワイルドカード文字に設定します*.jpg
。その結果、ファイル名がない場合はエラーが発生して終了します。テストの後半は、ワイルドカードの不一致のケースです(通常のshを使用)。どのこれはファイルなので、リテラル文字列 ""には展開されません*.jpg
。 Bashを使用している場合は、2番目のチェックを削除してコマンドshopt -s nullglob
の前にset
ワイルドカードを作成することもできます。削除済み拡張中に何も一致しない場合。
一致するファイルがある場合は、呼び出して7za
パラメータ拡張を介してアーカイブ名を指定します。これにより、末尾の「.jpg」が削除され、「.7z」が追加されます。