我正在Linux上的bash中编写脚本,需要遍历给定目录中的所有子目录名称。如何遍历这些目录(并跳过常规文件)?
为例:
给定的目录为/tmp/
它包含以下子目录:/tmp/A, /tmp/B, /tmp/C
我想检索A,B,C。
发布于 2010-01-21 17:04:02
cd /tmp
find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n'
一个简短的解释:
find
查找文件(相当于obviously).
是当前目录,在cd
之后是/tmp
(我的意思是,这比在find
命令中直接使用/tmp
更灵活。您只需要更改一个位置,即cd
,如果您希望在此result-type d
和directories-printf '%f\n
中执行更多操作,请确保find
只在当前目录中查找,而不将.
本身包含在result-type d
中。只查找directories-printf '%f\n
,每次命中都只打印找到的文件夹的名称(加上换行符)。就是这样!
发布于 2010-01-21 18:08:57
到目前为止,所有的答案都使用find
,所以这里只有一个带有外壳的答案。在您的案例中不需要外部工具:
for dir in /tmp/*/ # list directories in the form "/tmp/dirname/"
do
dir=${dir%*/} # remove the trailing "/"
echo "${dir##*/}" # print everything after the final "/"
done
发布于 2013-10-21 11:21:13
您可以使用以下命令遍历所有目录,包括隐藏目录(以点开头):
for file in */ .*/ ; do echo "$file is a directory"; done
注意:只有当文件夹中至少存在一个隐藏目录时,才能在zsh中使用列表*/ .*/
。在bash中,它还将显示.
和..
bash包含隐藏目录的另一种可能性是使用:
shopt -s dotglob;
for file in */ ; do echo "$file is a directory"; done
如果要排除符号链接:
for file in */ ; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
要在每个解决方案中仅输出尾部目录名(A、B、C),请在循环中使用以下命令:
file="${file%/}" # strip trailing slash
file="${file##*/}" # strip path and leading slash
echo "$file is the directoryname without slashes"
示例(这也适用于包含空格的目录):
mkdir /tmp/A /tmp/B /tmp/C "/tmp/ dir with spaces"
for file in /tmp/*/ ; do file="${file%/}"; echo "${file##*/}"; done
https://stackoverflow.com/questions/2107945
复制相似问题