Fah*_*tha 3 shell tar xargs wildcards
我有一个看起来像的目录
$ 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
Run Code Online (Sandbox Code Playgroud)
我想用一个命令解压缩所有与扩展名 *.tgz 匹配的文件,除了 Broad_hapmap3_r2_Affy6_cels_excluded.tgz。
我可以
ls *.tgz | xargs -n1 tar zxvf
Run Code Online (Sandbox Code Playgroud)
对于所有 *tgz 文件,但排除其中一部分的好方法是什么?在这种情况下,从网上阅读可能会发现 find ,但这似乎有点矫枉过正。预先感谢。
附录:我也对不排除文件的问题的替代方法感兴趣。
在 zsh 中:
setopt extended_glob
for z in *.tgz~Broad_hapmap3_r2_Affy6_cels_excluded.tgz; do tar xzf $z; done
Run Code Online (Sandbox Code Playgroud)
zsh 中的另一种可能性:
setopt extended_glob
zargs -n 1 -- *.tgz~Broad_hapmap3_r2_Affy6_cels_excluded.tgz -- tar xzf
Run Code Online (Sandbox Code Playgroud)
在 ksh 中(但不是 bash 或 zsh,因为它们不支持和模式):
for z in @(*.tgz&!(Broad_hapmap3_r2_Affy6_cels_excluded.tgz); do tar xzf "$z"; done
Run Code Online (Sandbox Code Playgroud)
ksh 中的另一种方式:
( FIGNORE=Broad_hapmap3_r2_Affy6_cels_excluded.tgz;
for z in *.tgz; do tar xzf "$z"; done )
Run Code Online (Sandbox Code Playgroud)
在 bash 中:
( GLOB_IGNORE=Broad_hapmap3_r2_Affy6_cels_excluded.tgz;
for z in *.tgz; do tar xzf "$z"; done )
Run Code Online (Sandbox Code Playgroud)
在任何外壳中:
for z in *.tgz; do
[ "$z" = Broad_hapmap3_r2_Affy6_cels_excluded.tgz ] || tar xzf "$z"
done
Run Code Online (Sandbox Code Playgroud)
另一种骇人听闻的方式:
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
Run Code Online (Sandbox Code Playgroud)
如果您还想对子目录中的文件进行操作, find 是一个自然的工具。下面的递归示例排除Broad_hapmap3_r2_Affy6_cels_excluded.tgz在任何子目录中命名的文件。
find . -name '*.tgz' -type f \
\! -name Broad_hapmap3_r2_Affy6_cels_excluded.tgz \
-exec tar xzf {} \;
Run Code Online (Sandbox Code Playgroud)
对于 zsh 或 bash 中的递归遍历?4,您可以**在模式中使用。在 zsh 中:
setopt extended_glob
zargs -n 1 -- **/*.tgz~**/Broad_hapmap3_r2_Affy6_cels_excluded.tgz -- tar xzf
Run Code Online (Sandbox Code Playgroud)
在 bash 中?4:
shopt -s globstar
( GLOB_IGNORE=Broad_hapmap3_r2_Affy6_cels_excluded.tgz;
for z in **/*.tgz; do tar xzf "$z"; done )
Run Code Online (Sandbox Code Playgroud)
如果您不想要递归遍历,您甚至可以使用 find ,尽管这不是最方便的方法。
find *.tgz -type f \
\! -name Broad_hapmap3_r2_Affy6_cels_excluded.tgz \
-exec tar xzf {} \;
Run Code Online (Sandbox Code Playgroud)