tar
は一つだけを処理する方法を知っています。tarファイル:一度にf
で指定されたファイル。コマンドラインで追加の名前を指定すると、指定された.tarファイルから抽出するファイルとして解釈されます。
これまでの回答のほとんどは、スペースや改行などの特殊文字を含む通常とは異なるファイル名を扱っていません。
正しい答えはこれです:
for file in *.tar.gz ; do
tar xzf "$file"
fi
他の許容可能な答えがfind
find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar xzf {} \;`
なぜできない私...
使用ls *.tar.gz | ...
を使用することです?
ls
はファイル名の特定の文字を壊してしまいます(つまり、安全ではありません)。このためにls
を使用する必要がある場合は、ls -1
を使用するよう注意してください。改行と改行のみをレコードセパレータとして扱うように注意してください。これはまだ安全ではありませんが、より安全です。
$file
を引用符なしで使用しますか?
名前にスペースが含まれているファイルは、とりわけあなたが期待していない方法で解釈されるためです。例:monthly backup.tar.gz
というファイルはtar xzf monthly backup.tar.gz
と解釈され、monthly
というアーカイブが存在しないため、エラーが発生します。
echo | xargs tar
を使用しますか?
echo
はファイル名、特に名前にスペースを含むファイル名をマングルするためです。
エスケープシーケンスとして解釈されることからの入力でバックスラッシュを防ぐことができますあなたはほとんど常にread -r
を使用したいwhile read
ループを実行します。 foo\bar
という名前のファイルがある場合は、read
なしで、-r
を正しく読み取れません。
EDIT:コメントパー
が、ここではサブディレクトリにtarballを抽出する方法です。
for file in *.tar.gz ; do
# strip any leading path information from the file name
name_only="${file##*/}"
# strip the extension .tar.gz
without_extension="${name_only%.tar.gz}"
# make a directory named after the tar file, minus extension
mkdir -p "$without_extension"
# extract the file into its own directory
tar xzf "$file" -C "$without_extension"
done
上記のうち、Iはtarballの名前を付けたディレクトリに抽出します。ただし、一意のディレクトリ名を作成するためのスキームで十分です。たとえば、番号の付いたディレクトリを抽出するバージョンを次に示します。
let n=0
for file in *.tar.gz ; do
mkdir -p "$n";
tar xzf "$file" -C "$n"
let n=n+1
done
良い答えですが、フォローアップの質問は、すべてのtar.gzが同じファイル名を持つようになりました。すべてを解凍すると、新しいファイルは古いファイルを上書きします。ファイル名を自動的に変更することで、どうやったら避けることができますか? –
@Kit Ho:これは、スクリプトごとに新しいサブディレクトリを作成する少し複雑なスクリプトを必要とします。私は答えを更新して、それを行う方法のサンプルを含めます。 – Sorpigal
非常に詳細な答え!ありがとう –