我有三个子目录的目录,父目录是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
我可以知道我在做什么错误。
答案 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