关于bash:如何在Linux中循环目录?

How to loop over directories in Linux?

我在Linux上的bash中编写了一个脚本,需要遍历给定目录中的所有子目录名。如何循环访问这些目录(并跳过常规文件)?

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

我想取回A,B,C。


到目前为止,所有的答案find操作系统的使用,这是一个与"壳"。在外部工具需要在您的案例:

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
'

解释:短find查找文件(很显然)

  • 。。。。。。。是当前目录的CD后,它的/tmp(恕我直言,这是更灵活的比有直接的/tmpfind命令。你只有一个地方的变化,cd,如果你想要更多的行动,以地方在这个文件夹)

  • -maxdepth 1-mindepth 1确保,这真的很find,只在当前目录和不包括在.T的结果

  • -type d只看目录。

  • -printf '%f
    版画只有发现文件夹的名称(加命中的每个字符)。

瞧!


你可以通过全隐directrories目录包括环(带点开始)和:

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

注意:在列表中有*/ .*/厂zsh如果至少存在一个隐藏的目录中的文件夹。它也将显示在.bash和..

另一种可能性是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:命令与find环。

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
"


我使用的技术是最经常find | xargs。例如,如果你想让每一个文件在这个目录下所有的子目录和它的世界的基础,你可以:

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

《期权与-print0终止空字符而不是空间。在-0期权)其输入相同的方式。这是操作系统的组合使用与在线文件的空间。

这个命令可以以图片的每一个链线由粘合它的输出端和findchmod)命令。

如果你想运行该命令的参数而不是在中间部位,是你的创意。例如,我需要为每个子目录的变化latemk -c和运行命令。我使用的操作系统(维基百科)

1
2
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蛛网膜下腔出血(SAH)是安全的,但他们是在与空间的目录名称。另外,该调用是到单独的制造stuff壳,这是为什么在我的命令,我们要返回当前目录中与popd回。


环的最小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

find . -type d -maxdepth 1