Shell
使用萬用字元解壓縮 *.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
我想用一個命令解壓縮與副檔名 *.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