Shell

使用萬用字元解壓縮 *.tgz 文件的目錄

  • February 16, 2011

我有一個看起來像的目錄

$ 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

我想用一個命令解壓縮與副檔名 *.tgz 匹配的所有文件,除了 Broad_hapmap3_r2_Affy6_cels_excluded.tgz。

我可以

ls *.tgz | xargs -n1 tar zxvf

對於所有 *tgz 文件,但是排除其中一部分的好方法是什麼?從線上閱讀可能會在這種情況下指示 find ,但這似乎有點過頭了。預先感謝。

附錄:我也對不排除文件的問題的替代方法感興趣。

在 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 )

在 bash 中:

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

對於這樣的一次性事情,我只是蠻力它:

for f in *.tgz; do 
  [[ "$f" != "Broad_hapmap3_r2_Affy6_cels_excluded.tgz" ]] && tar zxvf "$f"
done

引用自:https://unix.stackexchange.com/questions/7532