在下面的代码中,我希望看到find命令打印的find_examples_out / .t1,find_examples_out / .t2和find_examples_out / .s1文件,但由于某种原因它们被排除在外。它们出现在子目录中就好了。
测试脚本:
#!/bin/csh
# GNU find version 4.1.20
find -version
mkdir find_examples_out
cd find_examples_out
set FILES = (t1 .t1 t2 .t2 s1 .s1)
set DIRS = (.hidden normal notnormal another)
foreach f ( $FILES )
touch $f
end
foreach i ( $DIRS )
mkdir $i
cd $i
foreach f ( $FILES )
touch $f
end
cd ..
end
echo "Files present:"
ls -AR
echo
echo "Give me all files but exclude some paths:"
find . \
\( \
-path "\.?.*" \
-o -path "*normal*" \
\) \
-prune \
-o \
\
\( \
-type f \
\) \
-print
cd ..
rm -rf find_examples_out
这是输出:
GNU find version 4.1.20
Files present:
.:
another .hidden normal notnormal s1 .s1 t1 .t1 t2 .t2
./another:
s1 .s1 t1 .t1 t2 .t2
./.hidden:
s1 .s1 t1 .t1 t2 .t2
./normal:
s1 .s1 t1 .t1 t2 .t2
./notnormal:
s1 .s1 t1 .t1 t2 .t2
Give me all files but exclude some paths:
./t1
./t2
./s1
./another/t1
./another/.t1
./another/t2
./another/.t2
./another/s1
./another/.s1
我在这里缺少什么?
答案 0 :(得分:1)
除非我忽略了某些内容,否则-path开关会查找比较路径的模式,包括文件名。
Ergo,你的 -path“\。?。*”开关将匹配隐藏文件“.t1”等。
FWIW:在我所拥有的find版本(v4.4.2)中,-path的参数是shell模式,而不是正则表达式。但是,我使用bash并且从未使用过csh,所以也许这也会产生影响。
编辑:我尝试将其添加为评论,但它一直在破坏格式化。
你可以用它来实现你想要实现的目标:
find . \( \( -path "\.?.*" -type d \) -o -path "*normal*" \) -prune -o \( -type f \) -print