こんにちは、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つの理由で機能しません。
- 一重引用符内に式を使用しているため、
--transform
拡張は無効になります。 - globの使用方法が間違っていることは、ファイル名全体が一致することを
for f in *; do tar -xvf "$f.tar"...
意味します。たとえば、拡張すると誤った結果が発生する可能性が高くなります。*
1.tar
$f.tar
1.tar.tar
No 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
/は--transform
GNU拡張です。一部の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
これは私が望むものです。