How to loop over directories in Linux?
我在Linux上的bash中编写了一个脚本,需要遍历给定目录中的所有子目录名。如何循环访问这些目录(并跳过常规文件)?
例如:给定的目录是
我想取回A,B,C。
到目前为止,所有的答案
1 2 3 4 5 | 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 |
1 2 3 | cd /tmp find . -maxdepth 1 -mindepth 1 -type d -printf '%f ' |
解释:短
-
。。。。。。。是当前目录的CD后,它的
/tmp (恕我直言,这是更灵活的比有直接的/tmp find命令。你只有一个地方的变化,cd ,如果你想要更多的行动,以地方在这个文件夹) -
-maxdepth 1 和-mindepth 1 确保,这真的很find ,只在当前目录和不包括在. T的结果 -
-type d 只看目录。 -
-printf '%f 版画只有发现文件夹的名称(加命中的每个字符)。
瞧!
你可以通过全隐directrories目录包括环(带点开始)和:
1 | for file in */ .*/ ; do echo"$file is a directory"; done |
注意:在列表中有
另一种可能性是bash包括隐藏的目录将使用:
1 2 | shopt -s dotglob; for file in */ ; do echo"$file is a directory"; done |
如果你想排除的符号链接。
1 2 3 4 5 | for file in */ ; do if [[ -d"$file" && ! -L"$file" ]]; then echo"$file is a directory"; fi; done |
只有到输出目录的名称结尾的(A,B,C的每个解决方案中的questioned):在使用本线圈
1 2 3 | file="${file%/}" # strip trailing slash file="${file##*/}" # strip path and leading slash echo"$file is the directoryname without slashes" |
实例(这其中也包含与空间的作品目录):
1 2 | mkdir /tmp/A /tmp/B /tmp/C"/tmp/ dir with spaces" for file in /tmp/*/ ; do file="${file%/}"; echo"${file##*/}"; done |
作品目录,包含空间。
通过sorpigal灵感
1 2 3 | 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:命令与
1 2 3 | for D in $(find /path/to/dir/ -mindepth 1 -maxdepth 1 -type d) ; do echo $D ; done |
1 2 | find . -mindepth 1 -maxdepth 1 -type d -printf"%P " |
我使用的技术是最经常
1 2 | find . -type f -print0 | xargs -0 chmod go+r find . -type d -print0 | xargs -0 chmod go+rx |
《期权与
这个命令可以以图片的每一个链线由粘合它的输出端和
如果你想运行该命令的参数而不是在中间部位,是你的创意。例如,我需要为每个子目录的变化
1 2 | find . -type d -depth 1 -print0 | \ xargs -0 sh -c 'for dir; do pushd"$dir" && latexmk -c && popd; done' fnord |
本研究的
环的最小bash版本(你可以关断ghostdog74基础答案
1 2 3 4 | for dir in directory/* do echo ${dir} done |
zip文件到目录全由Bunch of
1 2 3 4 | for dir in directory/* do zip -r ${dir##*/} ${dir} done |