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

例如: 指定目录为/tmp/ 目录包括:/tmp/A、/tmp/B、/tmp/C

我想找回A B C。


当前回答

如果你想在一个for循环中执行多个命令,你可以用mapfile (bash >= 4)将find的结果保存为一个变量,然后用${dirlist[@]}遍历数组。它还适用于包含空格的目录。

find命令基于Boldewyn的回答。关于find命令的更多信息可以在这里找到。

IFS=""
mapfile -t dirlist < <( find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n' )
for dir in ${dirlist[@]}; do
    echo ">${dir}<"
    # more commands can go here ...
done

其他回答

find . -mindepth 1 -maxdepth 1 -type d -printf "%P\n"

处理包含空格的目录

灵感来自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的结果放入一个数组并迭代该数组并执行您想要的操作。不是最快的,而是更有条理的思考。

#!/bin/bash

cd /tmp

declare -a results=(`find -type d`)

#Iterate the results

for path in ${results[@]}
do
    echo "Your path is $path"
    #Do something with the path..

    if [[ $path =~ "/A" ]]; then
        echo $path | awk -F / '{print $NF}'
        #prints A

    elif [[ $path =~ "/B" ]]; then
        echo $path | awk -F / '{print $NF}'
        #Prints B

    elif [[ $path =~ "/C" ]]; then
        echo $path | awk -F / '{print $NF}'
        #Prints C
    fi
done

这可以简化为查找-type d | grep "/A" | awk -F / '{print $NF}'打印A

find -type d | grep "/B" | awk -F / '{print $NF}'打印B find -type d | grep "/C" | awk -F / '{print $NF}'打印C

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

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

找到。-type d -maxdepth