ワイルドカードを使用して *.tgz ファイルを抽出するディレクトリ

ワイルドカードを使用して *.tgz ファイルを抽出するディレクトリ

次のディレクトリがあります。

$ 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 {} \;

おすすめ記事