次のディレクトリがあります。
$ ls
Broad_hapmap3_r2_Affy6_cels_excluded.tgz DINGO.tgz GIGAS.tgz index.html IONIC.tgz passing_cels_sample_map.txt SCALE.tgz
CHEAP.tgz EPODE.tgz HOMOS.tgz index.html?C=M;O=A LOVED.tgz PICUL.tgz SHELF.tgz
CORER.tgz excluded_cels_md5.txt HUFFS.tgz index.html?C=N;O=D NIGHS.tgz POSIT.tgz SLOTH.tgz
CUPID.tgz excluded_cels_sample_map.txt HUSKS.tgz index.html?C=S;O=A passing_cels_md5.txt SAKES.tgz TESLA.tgz
Broad_hapmap3_r2_Affy6_cels_excluded.tgzを除いて、*.tgz拡張子と一致するすべてのファイルを解凍するために単一のコマンドを使用したいと思います。
私はできます。
ls *.tgz | xargs -n1 tar zxvf
すべての* tgzファイルを除いていくつかのファイルを除外する良い方法は何ですか?オンラインで読むと、この状況の兆候を見つけることができますが、これは過剰であるようです。よろしくお願いします。
付録:ファイルを除外しない問題の代替案にも興味があります。
ベストアンサー1
zshから:
setopt extended_glob
for z in *.tgz~Broad_hapmap3_r2_Affy6_cels_excluded.tgz; do tar xzf $z; done
zshのもう一つの可能性:
setopt extended_glob
zargs -n 1 -- *.tgz~Broad_hapmap3_r2_Affy6_cels_excluded.tgz -- tar xzf
kshで(しかしbashまたはzshはモードをサポートしていないので除く):
for z in @(*.tgz&!(Broad_hapmap3_r2_Affy6_cels_excluded.tgz); do tar xzf "$z"; done
kshの別の方法:
( FIGNORE=Broad_hapmap3_r2_Affy6_cels_excluded.tgz;
for z in *.tgz; do tar xzf "$z"; done )
バッシュから:
( GLOB_IGNORE=Broad_hapmap3_r2_Affy6_cels_excluded.tgz;
for z in *.tgz; do tar xzf "$z"; done )
すべてのシェルで:
for z in *.tgz; do
[ "$z" = Broad_hapmap3_r2_Affy6_cels_excluded.tgz ] || tar xzf "$z"
done
別のハッキングがあります。
mv Broad_hapmap3_r2_Affy6_cels_excluded.tgz Broad_hapmap3_r2_Affy6_cels_excluded.tgz.not
for z in *.tgz; do tar xzf "$z"; done
mv Broad_hapmap3_r2_Affy6_cels_excluded.tgz.not Broad_hapmap3_r2_Affy6_cels_excluded.tgz
サブディレクトリにあるファイルにも対処するには、findは自然なツールです。次の再帰例では、Broad_hapmap3_r2_Affy6_cels_excluded.tgz
すべてのサブディレクトリに名前が付けられたファイルを除外します。
find . -name '*.tgz' -type f \
\! -name Broad_hapmap3_r2_Affy6_cels_excluded.tgz \
-exec tar xzf {} \;
**
zshまたはbash ≥4の再帰巡回にはモードで使用できます。 zshから:
setopt extended_glob
zargs -n 1 -- **/*.tgz~**/Broad_hapmap3_r2_Affy6_cels_excluded.tgz -- tar xzf
Bash ≥4から:
shopt -s globstar
( GLOB_IGNORE=Broad_hapmap3_r2_Affy6_cels_excluded.tgz;
for z in **/*.tgz; do tar xzf "$z"; done )
再帰的に探索したくない場合は find を使用することもできますが、これが最も便利な方法ではありません。
find *.tgz -type f \
\! -name Broad_hapmap3_r2_Affy6_cels_excluded.tgz \
-exec tar xzf {} \;