我有一个文件夹,其中包含 28 个扩展名为 gz 的文件.gz
和 28 个扩展名为.gz.bam
.
我想解压所有 28 个.gz
文件并将它们发送到另一个文件夹。我是一一做的,如下:
gunzip -c file1.gz > /mnt/s3/data_transfer/file1
如何指定我想要 .gz 而不是 .gz.bam?
答案1
只需迭代它们:
for file in *gz; do
gunzip -c -- "$file" > /mnt/s3/data_transfer/"${file%.gz}"
done
is "${file%.gz}"
shell 语法将返回 的值$file
并删除最后一个值.gz
。
请注意,这种快速而肮脏的方法不如下面的 Stéphane 那样健壮,如果您在没有gz
文件的目录中运行它,它会尝试对*gz
模式本身进行压缩。只要您确实有以gz
.此外,与他的不同的是,如果其中一个文件未能正确解压,这个文件不会以失败状态退出。如果这些对您来说是问题,请改用他的方法。
答案2
和bash
:
(
ret=0
shopt -s nullglob
for file in *.gz; do
gunzip < "$file" > /mnt/s3/data_transfer/"${file%.gz}" || ret="$?"
done
exit "$ret"
)
(dotglob
如果您还想处理隐藏.gz
文件,即名称以 开头的文件,也请设置该选项.
)。
在zsh
:
(
ret=0
for file (*.gz(N.)) gunzip < $file > /mnt/s3/data_transfer/$file:r || ret=$?
exit $ret
)
(还添加.
glob 限定符以将 glob 扩展限制为常规的文件;添加D
限定符来处理隐藏文件)。