mik*_*son 181 bash command directory-traversal
我正在处理需要在特定文件夹的每个子目录中执行操作的脚本.
写这个最有效的方法是什么?
kan*_*aka 268
避免创建子流程的版本:
for D in *; do
if [ -d "${D}" ]; then
echo "${D}" # your processing here
fi
done
Run Code Online (Sandbox Code Playgroud)
或者,如果您的操作是单个命令,则更简洁:
for D in *; do [ -d "${D}" ] && my_command; done
Run Code Online (Sandbox Code Playgroud)
或者更简洁的版本(感谢@enzotib).请注意,在此版本中,每个值D
都有一个尾部斜杠:
for D in */; do my_command; done
Run Code Online (Sandbox Code Playgroud)
Mik*_*ark 167
for D in `find . -type d`
do
//Do whatever you need with D
done
Run Code Online (Sandbox Code Playgroud)
d0x*_*d0x 95
最简单的非递归方式是:
for d in */; do
echo "$d"
done
Run Code Online (Sandbox Code Playgroud)
将/
在年底告诉,只使用目录.
没有必要
ken*_*orb 15
find
命令.在GNU中find
,您可以使用-execdir
参数:
find . -type d -execdir realpath "{}" ';'
Run Code Online (Sandbox Code Playgroud)
或者使用-exec
参数:
find . -type d -exec sh -c 'cd -P "$0" && pwd -P' {} \;
Run Code Online (Sandbox Code Playgroud)
或者用xargs
命令:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Run Code Online (Sandbox Code Playgroud)
或者使用for循环:
for d in */; { echo "$d"; }
Run Code Online (Sandbox Code Playgroud)
对于递归,请尝试使用扩展的globbing(**/
)(启用by :) shopt -s extglob
.
有关更多示例,请参阅:如何转到每个目录并执行命令?在SO
Sri*_*ali 12
方便的单行
for D in *; do echo "$D"; done
for D in *; do find "$D" -type d; done ### Option A
find * -type d ### Option B
Run Code Online (Sandbox Code Playgroud)
选项A对于中间有空格的文件夹是正确的.此外,通常更快,因为它不会将文件夹名称中的每个单词打印为单独的实体.
# Option A
$ time for D in ./big_dir/*; do find "$D" -type d > /dev/null; done
real 0m0.327s
user 0m0.084s
sys 0m0.236s
# Option B
$ time for D in `find ./big_dir/* -type d`; do echo "$D" > /dev/null; done
real 0m0.787s
user 0m0.484s
sys 0m0.308s
Run Code Online (Sandbox Code Playgroud)
这将创建一个子shell(这意味着当while
循环退出时变量值将丢失):
find . -type d | while read -r dir
do
something
done
Run Code Online (Sandbox Code Playgroud)
这不会:
while read -r dir
do
something
done < <(find . -type d)
Run Code Online (Sandbox Code Playgroud)
如果目录名中有空格,则任何一个都可以工作.
如果目录名称有空格,则接受的答案将在空格处中断,并且首选语法是$()
bash/ksh。使用GNU find
-exec
选项与+;
例如
find .... -exec mycommand +;
#this is same as passing to xargs
或使用 while 循环
find .... | while read -r D
do
# use variable `D` or whatever variable name you defined instead here
done
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以尝试:
#!/bin/bash
### $1 == the first args to this script
### usage: script.sh /path/to/dir/
for f in `find . -maxdepth 1 -mindepth 1 -type d`; do
cd "$f"
<your job here>
done
Run Code Online (Sandbox Code Playgroud)
或类似...
说明:
find . -maxdepth 1 -mindepth 1 -type d
:仅查找最大递归深度为1(仅子目录为$ 1)且最小深度为1(不包括当前文件夹.
)的目录
归档时间: |
|
查看次数: |
167826 次 |
最近记录: |