对所有子文件夹运行命令

对所有子文件夹运行命令

如果您有一系列子文件夹(例如 fromaz)并且想要对每个子文件夹运行命令(例如rm *.pdfls *.pdf),您该怎么做? “手动”方法是cd arm *.pdf、 、ls *.pdfcd ..cd b、 ... 这似乎太复杂了,所以我相信一定有一种更简单的方法。

答案1

尝试这样做(使用,大括号扩展和球):

rm -f {a..z}/*.pdf

或者

rm -f [a-z]/*.pdf

如果你的 shell 缺少大括号扩展特征。

与 相反[a-z]{a..z}(ksh93 也支持)不是,它是大括号扩展,无论文件是否存在,glob它都会扩展(在 之前)。globs就好像rm -f a/*.pdf b/*.pdf……,不管a、b……存在与否。另请注意,与[a-z]范围可能取决于区域设置的情况相反(例如可能包括é, ś...),{a..z}仅适用于字节范围(并且仅可靠地适用于ASCII字母范围和数字范围)

(感谢斯蒂芬·查泽拉斯的解释)

答案2

对于这个特定的例子:

rm [a-z]/*.pdf

在任何外壳中。

在一般情况下,使用类似 Bourne 的 shell,您可以将目录列表放入$1, $2... 中:

set a b c foo bar...

然后像这样循环它:

for i do (cd -- "$i" && cmd -- *.pdf); done

当然,您可以通过一个命令来完成这两项操作:

for i in a b c foo bar...; do (cd -- "$i" && cmd -- *.pdf); done

重点是使用子 shell (...),以便cd仅影响该子上下文。

答案3

find 可能是最好的解决方案,但在 shell (bash) 中很容易实现:

GLOBIGNORE=.
for subdir in *; do
  test -d "$subdir" || continue
  cd "$subdir"
  ls *pdf
  cd -
done

甚至更容易

ls */*.pdf

答案4

使用寻找。类似以下内容将找到所有文件夹(深度不超过两个文件夹),然后rm <pathname>/*.pdf从该文件夹执行:

find pathwithsubfolders -type d -maxdepth 1 -mindepth 1 -exec rm {}/\*.pdf \;

在我看来,处理这样的命令(你知道,那些可能带来可怕后果的命令)最好的办法是在你试图执行的命令前面添加一个“echo”语句......只是为了确保它看起来就像你扣动扳机之前想要的那样。

相关内容