当尝试使用find命令修剪隐藏的目录时,它似乎“修剪”顶部目录中的隐藏文件?

时间:2012-01-06 17:09:48

标签: find csh

在下面的代码中,我希望看到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

我在这里缺少什么?

1 个答案:

答案 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