如何在Linux中循环目录?

我在Linux上使用bash编写脚本,需要浏览给定目录中的所有子目录名称。 我如何循环这些目录(并跳过常规文件)?

例如:
给定的目录是/tmp/
它有以下子目录: /tmp/A, /tmp/B, /tmp/C

我想检索A,B,C

 cd /tmp find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n' 

简单的解释: find文件(很明显)

  • 。 是cd /tmp之后的当前目录(恕我直言,这比直接在find命令中直接使用/tmp更灵活,如果你想在这个文件夹中做更多的动作,你只有一个地方, )

  • -maxdepth 1-mindepth 1确保, find真的,只在当前目录中查找,不包含' . “结果

  • -type d只查找目录

  • -printf '%f\n只打印find的文件夹的名称(加一个换行符)。

呃瞧!

到目前为止所有的答案都使用find ,所以这里只有一个shell。 您的情况下不需要外部工具:

 for dir in /tmp/*/ do dir=${dir%*/} echo ${dir##*/} done 

您可以循环遍历所有目录,包括隐藏的目录(以点开头):

 for file in */ .*/ ; do echo "$file is a directory"; done 

注意: 只有在文件夹中至less存在一个隐藏目录的情况下,使用列表*/ .*/ /。* */ .*/才能在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 

要仅输出每个解决scheme中的尾随目录名称(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 

适用于包含空格的目录

灵感来自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 . -mindepth 1 -maxdepth 1 -type d -printf "%P\n" 

我最常使用的技术是find | xargs find | xargs 。 例如,如果要使此目录中的所有文件及其所有子目录都可读,您可以执行以下操作:

 find . -type f -print0 | xargs -0 chmod go+r find . -type d -print0 | xargs -0 chmod go+rx 

-print0选项以NULL字符而不是空格结束。 -0选项以相同的方式分割input。 所以这是在带有空格的文件上使用的组合。

你可以把这个命令链看作是通过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); do stuff; done有影响for dir $(subdirs); do stuff; done for dir $(subdirs); do stuff; done for dir $(subdirs); do stuff; done ,但对名称中有空格的目录是安全的。 而且,对stuff的单独调用是在同一个shell中完成的,这就是为什么在我的命令中我们必须用popd返回到当前目录。

find . -type d -maxdepth 1