![对所有子文件夹运行命令](https://linux22.com/image/29665/%E5%AF%B9%E6%89%80%E6%9C%89%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
如果您有一系列子文件夹(例如 froma
到z
)并且想要对每个子文件夹运行命令(例如rm *.pdf
或ls *.pdf
),您该怎么做? “手动”方法是cd a
、rm *.pdf
、 、ls *.pdf
、cd ..
、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”语句......只是为了确保它看起来就像你扣动扳机之前想要的那样。