我正在Linux上编写bash脚本,需要遍历给定目录中的所有子目录名。如何遍历这些目录(并跳过常规文件)?
例如: 指定目录为/tmp/ 目录包括:/tmp/A、/tmp/B、/tmp/C
我想找回A B C。
我正在Linux上编写bash脚本,需要遍历给定目录中的所有子目录名。如何遍历这些目录(并跳过常规文件)?
例如: 指定目录为/tmp/ 目录包括:/tmp/A、/tmp/B、/tmp/C
我想找回A B C。
当前回答
找到。-type d -maxdepth
其他回答
我最常用的技术是找到|个xargs。例如,如果你想让这个目录中的每个文件及其所有子目录都是世界可读的,你可以这样做:
find . -type f -print0 | xargs -0 chmod go+r
find . -type d -print0 | xargs -0 chmod go+rx
-print0选项以NULL字符而不是空格结束。-0选项以同样的方式分割其输入。这是在有空格的文件上使用的组合。
您可以将此命令链想象为通过find获取每一行输出,并将其粘贴到chmod命令的末尾。
如果您希望将命令作为参数运行在中间,而不是在末尾,则必须有点创造性。例如,我需要切换到每个子目录并运行命令latemk -c。所以我用了(来自维基百科):
find . -type d -depth 1 -print0 | \
xargs -0 sh -c 'for dir; do pushd "$dir" && latexmk -c && popd; done' fnord
它的作用是for dir $(subdirs);做的东西;完成,但是对于名称中有空格的目录是安全的。另外,对stuff的单独调用是在同一个shell中进行的,这就是为什么在我的命令中,我们必须使用popd返回到当前目录。
find . -mindepth 1 -maxdepth 1 -type d -printf "%P\n"
如果你想在一个for循环中执行多个命令,你可以用mapfile (bash >= 4)将find的结果保存为一个变量,然后用${dirlist[@]}遍历数组。它还适用于包含空格的目录。
find命令基于Boldewyn的回答。关于find命令的更多信息可以在这里找到。
IFS=""
mapfile -t dirlist < <( find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n' )
for dir in ${dirlist[@]}; do
echo ">${dir}<"
# more commands can go here ...
done
处理包含空格的目录
灵感来自Sorpigal
while IFS= read -d $'\0' -r file ; do
echo $file; ls $file ;
done < <(find /path/to/dir/ -mindepth 1 -maxdepth 1 -type d -print0)
原帖(不适用空格)
灵感来自Boldewyn:使用find命令的循环示例。
for D in $(find /path/to/dir/ -mindepth 1 -maxdepth 1 -type d) ; do
echo $D ;
done
简而言之,将find的结果放入一个数组并迭代该数组并执行您想要的操作。不是最快的,而是更有条理的思考。
#!/bin/bash
cd /tmp
declare -a results=(`find -type d`)
#Iterate the results
for path in ${results[@]}
do
echo "Your path is $path"
#Do something with the path..
if [[ $path =~ "/A" ]]; then
echo $path | awk -F / '{print $NF}'
#prints A
elif [[ $path =~ "/B" ]]; then
echo $path | awk -F / '{print $NF}'
#Prints B
elif [[ $path =~ "/C" ]]; then
echo $path | awk -F / '{print $NF}'
#Prints C
fi
done
这可以简化为查找-type d | grep "/A" | awk -F / '{print $NF}'打印A
find -type d | grep "/B" | awk -F / '{print $NF}'打印B find -type d | grep "/C" | awk -F / '{print $NF}'打印C