如何在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