7zaはアーカイブ名を読みます。

7zaはアーカイブ名を読みます。

次の問題があります。同じフォルダにある拡張子が.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」が追加されます。

おすすめ記事