shell循环可以解压目录中的所有文件吗?

shell循环可以解压目录中的所有文件吗?,shell,directory,loops,unzip,Shell,Directory,Loops,Unzip,我见过解压目录中所有zip文件的循环。但是,在运行此操作之前,我宁愿确保我将要运行的操作正常: for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done 基本上,我想让它查看“dir”的输出,查看所有文件夹,对于每个目录cd,解压所有zip存档,然后删除它们,然后将cd放回,然后再次执行,直到没有更多 这是我应该在一个命令中做的事情还是应该考虑在perl中这样做?使用 */Cord>获取当前目录的内容: for i in

我见过解压目录中所有zip文件的循环。但是,在运行此操作之前,我宁愿确保我将要运行的操作正常:

for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done
基本上,我想让它查看“dir”的输出,查看所有文件夹,对于每个目录cd,解压所有zip存档,然后删除它们,然后将cd放回,然后再次执行,直到没有更多


这是我应该在一个命令中做的事情还是应该考虑在perl中这样做?

使用<代码> */Cord>获取当前目录的内容:

for i in *; do cd "$i"; ...etc... ; done
在尝试将cd刻录到某个目录之前,还应该确保该目录是一个目录。在bash中,这是按如下方式完成的:

if [ -d "$i" ]; then ...etc... ; fi
在删除zip文件之前,还应仔细检查解压操作是否成功。删除单个文件时不需要使用递归强制删除


我认为,这是在推动一条线的合理做法的极限。将其放入shell脚本中,并在多行上格式化。

一般来说,您应该可以。对于调试,只需在循环中的所有命令前面加上
echo
即可告诉您变量是如何展开的。您也可以始终使用
rm-i
被询问,而不是让
rm
继续使用
-f
执行任何操作

unzip
调用中的单引号将仅解压缩名为
*.zip
的文件,即
*
不会展开。改为使用双引号(或完全不使用引号)

现在,循环假设所有目录
$i
都直接位于当前目录下。更通用的解决方案是使用目录堆栈(
pushd
popd

部分测试:

find . -type d -exec  sh -c "cd \"{}\" ;  unzip \"*.zip\" ; rm \"*.zip\"  "  \;

为每个子目录执行
cd
/
解压
/
rm
链。

对其他人所说的内容进行补充:

  • 如果将参数放在单引号中,如在
    '*.zip'
    中,shell将不会进行通配符扩展,解压将尝试处理一个按字面意思称为
    *.zip
  • 如果只想删除单个文件,请不要将
    -r
    用作
    rm
    的参数。这是不必要的危险,因为子目录的任何递归删除可能都不是有意的
  • 您应该检查
    unzip
    的返回代码,并且只有在解压缩成功时才删除zip文件(例如,如果unzip*.zip;然后rm*.zip;fi
,您可以说
,或者甚至使用显式
for
循环逐个处理zip文件)
当你想知道某个东西是否有效,但又担心它的破坏性后果时,一次做一点:

确保获得正确的文件:

for i in dir; do cd $i; echo $i; cd ..; done
在删除文件之前,请确保可以解压缩文件:

for i in dir; do cd $i; unzip '*.zip'; cd ..; done

在完成整个月之前,请备份您的目录。

您好,欢迎来到StackOverflow。为了使代码更具可读性,请使用code标记获取信息,您可以使用cd-返回上一个目录。我必须将第一个目录从for i in dir更改为for i in*,它取消了压缩,但是,名称中包含空格的文件有问题。@帮助:我隐式地假设
dir
是一个变量,但事实并非如此,因此我的示例是错误的。此处修复,现在假设
dir
是一个保存目录列表的变量。到目前为止,这是有效的,其他答案不能接受“文件夹名加空格”之类的内容,但是它不能删除.zip存档。我想你必须使用
查找…|xargs-0…
来处理空格,还是用转义引号来完成这项工作?最后,我可以将您的命令行修改为:find-名称“*.zip”-exec sh-c“rm-rf\”{}\”;删除所有剩余的.zip存档。感谢您删除zip文件,您可以使用
find-名称“*.zip”-exec rm-rf{}\(当您只发出一个命令时,不必使用sh-c…)
for i in dir; do cd $i; unzip '*.zip'; cd ..; done