不要列出上述目录中的文件

时间:2017-11-07 08:10:43

标签: bash

我有三个子目录的目录,父目录是a,b,& C。 a1和a2是a,b1和b2的子目录是b的子目录,c1和c2是c的子目录。文件的排列方式如下:a.txt(a),a1.txt(a1),a2.txt(a2),b.txt(b),b1.txt(b1),b2.txt(b2),c .txt(c),c1.txt(c1),c2.txt(c2)。现在我试图列出文件,我想忽略整个目录中的文件a及其子目录a1& a2,并希望仅在目录b1而不是目录b或b2中igonre文件,并且只想忽略文件在目录c2中不是目录c或c1。我尝试的脚本在下面

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

以上脚本的结果是

a.txt
a2.txt
b.sh: a1: does not exist

我可以知道我在做什么错误。

1 个答案:

答案 0 :(得分:1)

重现测试

mkdir -p {a/a,b/b,c/c}{1,2}
touch {a/a,b/b,c/c}.txt
for d in {a/a,b/b,c/c}{1,2}; do touch $d/${d#*/}.txt; done

find . -type f
./a/a.txt
./a/a1/a1.txt
./a/a2/a2.txt
./b/b.txt
./b/b1/b1.txt
./b/b2/b2.txt
./c/c.txt
./c/c1/c1.txt
./c/c2/c2.txt

查找命令

find . \( -path ./a -o -path ./b/b1 -o -path ./c/c2 \) -prune -o -print

解释

目录上的

-prune将阻止find进入它,在相应于-o的转义括号-or之间应用条件,但是在匹配文件后它会返回true -o条件可以添加(默认联结为-a-and可以省略)和操作(-printf -ls -exec等)。

其他例子:

find . \( -path ./a -o -path ./b/b1 -o -path ./c/c2 \) -prune -type f -o -type f
./b/b.txt
./b/b2/b2.txt
./c/c.txt
./c/c1/c1.txt

评论后编辑:

find . -type d \( -name a -o -name b1 -o -name c2 \) -prune -type f -o -type f -printf '%f\n'
b.txt
b2.txt
c.txt
c1.txt

在最后评论后编辑(SunOS发现没有-printf):

find . -type d \( -name a -o -name b1 -o -name c2 \) -prune -o -type f -exec sh -c 'for f; do d=${f%/*}; echo "${d##*/}" "${f##*/}"; done' sh-echo {} +
b b.txt
b2 b2.txt
c c.txt
c1 c1.txt