我正在编写一个脚本,需要在特定文件夹的每个子目录中执行一个操作。

最有效的写法是什么?


当前回答

如果目录名中有空格,则接受的答案将在空格上中断,对于bash/ksh,首选语法是$()。使用GNU find -exec选项+;如

找到……- mycommand +;#这和传递给xargs是一样的

或者使用while循环

find .... | while read -r D
do
    # use variable `D` or whatever variable name you defined instead here
done 

其他回答

使用find命令。

在GNU find中,你可以使用-execdir参数:

find . -type d -execdir realpath "{}" ';'

或者使用-exec parameter:

find . -type d -exec sh -c 'cd -P "$0" && pwd -P' {} \;

或者使用xargs命令:

find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'

或者使用for循环:

for d in */; { echo "$d"; }

对于递归,请尝试扩展通配符(**/)(通过:shopt -s extglob启用)。


有关更多示例,请参见:如何进入每个目录并执行命令?在所以

找到。-type d -print0 | xargs -0 -n 1 my_command

for D in `find . -type d`
do
    //Do whatever you need with D
done

避免创建子进程的版本:

for D in *; do
    if [ -d "${D}" ]; then
        echo "${D}"   # your processing here
    fi
done

或者,如果你的操作是一个单一的命令,这是更简洁的:

for D in *; do [ -d "${D}" ] && my_command; done

或者一个更简洁的版本(感谢@enzotib)。注意,在这个版本中,每个D的值都有一个尾随斜杠:

for D in */; do my_command; done

如果目录名中有空格,则接受的答案将在空格上中断,对于bash/ksh,首选语法是$()。使用GNU find -exec选项+;如

找到……- mycommand +;#这和传递给xargs是一样的

或者使用while循环

find .... | while read -r D
do
    # use variable `D` or whatever variable name you defined instead here
done