编写 shell 脚本列出除少数目录外的所有目录中的文件

编写 shell 脚本列出除少数目录外的所有目录中的文件

我想列出每个目录中的文件,该目录也包含子目录,在目录中我应该忽略几个目录,它可能是父目录或子目录。从下面的脚本中,我只能列出一个目录中的文件,而不会在其他目录中循环。请让我知道如何解决这个问题。

我尝试过的脚本

#!/bin/sh
find * -type d | while IFS= read d; do
    dirname=`basename $d`
        if [ ${dirname} != "Decommissioned" ]; then
          cd $dirname
          find * ! -name . -prune -type f | while read fname; do
             fname=`basename $fname`
             echo $fname
          done
        else
           continue
        fi
done

答案1

如果您想列出所有常规文件但跳过名为的目录中的文件退役,你会这样做:

find . -name Decommissioned -type d -prune -o -type f -print

如果您只想使用 GNU 的基本名称,find则可以将其替换-print-printf '%f\n'.或者 POSIXly:

find . -name Decommissioned -type d -prune -o -type f -exec sh -c '
  for file do;
    printf "%s\n" "${file##*/}"
  done' sh {} +

或者,如果您可以保证所有文件名都不包含换行符:

find . -name Decommissioned -type d -prune -o -type f -print |
  awk -F / '{print $NF}'

答案2

下面的代码将忽略“Decommissioned”目录并列出其他目录中的文件。

find . -type d | while read DirName
do
   echo "${DirName}" | grep "Decommissioned" >/dev/null 2>&1
   if [ "$?" -ne "0" ]
   then
        find ${DirName} -type f | awk -F/ '{print $NF}'
   fi
done

根据评论回答

bash-4.1$ find .
.
./c
./c/c.txt
./c/c2
./c/c2/c2.txt
./c/c1
./c/c1/c1.txt
./a
./a/a.txt
./a/a2
./a/a2/a2.txt
./a/a1
./a/a1/a1.txt
./b
./b/b2
./b/b2/b2.txt
./b/b1
./b/b1/b1.txt
./b/b.txt

bash-4.1$ find . | grep -vE "a/|b2" | grep "\.txt"
./c/c.txt
./c/c2/c2.txt
./c/c1/c1.txt
./b/b1/b1.txt
./b/b.txt

相关内容