![如何在目录内的所有目录中运行循环](https://linux22.com/image/180734/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%9B%AE%E5%BD%95%E5%86%85%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%AE%E5%BD%95%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%BE%AA%E7%8E%AF.png)
假设我有一个名为 的目录/tmp/main
,其中有 100 个其他目录。
我想循环遍历这些目录的每个目录,例如使用touch test.txt
我如何告诉脚本处理第一个、第二个、第三个等等?
答案1
一个简单的循环就可以工作:
for dir in /tmp/main/*/; do
touch "$dir"/test.txt
done
/
模式末尾的保证/tmp/main/*/
如果模式匹配任何内容,它将匹配目录。
在 中bash
,您可能需要在循环之前设置nullglob
shell 选项shopt -s nullglob
,以确保在模式与任何内容都不匹配时循环根本不会运行。如果没有nullglob
设置,循环仍将运行一次,并且模式在 中未展开$dir
。解决这个问题的另一种方法是在调用之前确保它$dir
实际上是一个目录touch
:
for dir in /tmp/main/*/; do
if [ -d "$dir" ]; then
touch "$dir"/test.txt
fi
done
或者,等价地,
for dir in /tmp/main/*/; do
[ -d "$dir" ] && touch "$dir"/test.txt
done
答案2
您可以使用find
:
find /tmp/main -type d -exec touch {}/test.txt \;
如果您想排除该/tmp/main
文件夹在使用结果中返回find
:
find /tmp/main ! -path /tmp/main -type d -exec touch {}/test.txt \;
或者
find /tmp/main -mindepth 1 -type d -exec touch {}/test.txt \;