我想在当前路径中的每个目录中执行一些任务,所以我尝试
for DIRECTORY in `find . -type d -maxdepth 1`
do
cd $DIRECTORY
#DO STUFF
cd ..
done
但我收到了一个很长的错误,说没有这样的文件。
updateall.sh: line 5: cd: ./abc No such file or directory
为什么?我尝试过 cd ./abc 并且没有问题。
谢谢
答案1
您需要添加-mindepth 1
。否则,您将cd ..
在第一次循环重复中从原始基目录退出并最终进入其父目录。
当你试运行表达式时很容易注意到find
:
$ find . -type d -maxdepth 1
.
./abc
在第一个循环中,您cd .
什么也不做,然后cd ..
,您无法进入找到的所有其他目录。
如果目录名中的空格没有问题,您可以随时使用绝对路径find $PWD
来代替find .
,或者将原始路径存储在您可以(但可能不会起作用)的$PWD
变量中,而不是。cd
$OLDPWD
cd -
cd ..
答案2
如果您使用 gnu-find,您可以考虑使用 -execdir。它类似于 -exec,但会从目录执行命令。(例如,如果它要填充多行,它可能是一个临时脚本。)
find . -type d -maxdepth 1 -mindepth 1 -execdir dostuff ";"
使用
for DIRECTORY in `find ...`
容易受到目录名称中的空格和类似内容的影响。
例子:
mkdir "a a"
echo "123" > a
for f in $(find . -mindepth 1 -type d); do echo "using $f"; ls -l $f ; done
using ./a
-rw-r--r-- 1 stefan stefan 4 2012-01-13 08:15 ./a
using a
-rw-r--r-- 1 stefan stefan 4 2012-01-13 08:15 a