フォルダから複数のtarファイルとそのファイル名を抽出します。

フォルダから複数のtarファイルとそのファイル名を抽出します。

こんにちは、1.tar 2.tar 3.tar..etcなどのtarファイルが複数あり、それらをそれぞれのフォルダ(例:1.tarを1というフォルダに抽出するなど)に抽出したいと思います。私の試用版は次のとおりです。 :

   for f in *; do
   tar -xvf "$f.tar" --xform='s|^|$f/|S';
   done

期待どおりに動作しません。どうすればいいですか?

答え1

次の2つの理由で機能しません。

  1. 一重引用符内に式を使用しているため、--transform拡張は無効になります。
  2. globの使用方法が間違っていることは、ファイル名全体が一致することをfor f in *; do tar -xvf "$f.tar"...意味します。たとえば、拡張すると誤った結果が発生する可能性が高くなります。*1.tar$f.tar1.tar.tarNo such file or directory

次のようにしてみてください。

for f in *.tar
do
tar -tf  "$f" --xform="s|^|${f%.*}/|S" --show-transformed-names
done

出力が満足な場合は、dry-runコマンドを次のように置き換えます。

tar -xf  "$f" --xform="s|^|${f%.*}/|S"

この特別なケースでは簡単に実行できますが、

for f in *.tar; do tar -xf "$f" --one-top-level; done

答え2

--xform/は--transformGNU拡張です。一部のtar実装では-sこれを行います(標準と同じpax)。

ここtarで代わりにGNUを使用すると、そのために設計されたものを--xform使用できます。--one-top-level

for f in *.tar; do
  tar --one-top-level="${f%.tar}" -xf "$tar"
done

.tar(現在のディレクトリに次の名前で終わる隠しファイルが1つ以上あると仮定します)または次のいずれかを使用しますzsh

for f (*.tar(N)) tar --one-top-level=$f:r -xf $f

答え3

私は次のように動作させました。

for t in *.tar ; do
  bn="$(basename -- "$t" .tar)"
  mkdir -p -- "$bn" &&
    tar -xf "$t" -C "$bn"
done

これは私が望むものです。

関連情報