使用find命令但排除两个目录中的文件
我想查找以_peaks.bed
结尾的文件,但排除tmp
和scripts
文件夹中的文件。
我的命令是这样的:
find . -type f \( -name "*_peaks.bed" ! -name "*tmp*" ! -name "*scripts*" \)
但它没有工作。 tmp
和script
文件夹中的文件仍将显示。
有没有人有这个想法?
以下是如何使用find
来指定的:
find . -type f -name "*_peaks.bed" ! -path "./tmp/*" ! -path "./scripts/*"
说明:
-
find .
– 从当前工作目录开始查找(默认recursion) -
-type f
– 指定find
结果中只包含文件 -
-name "*_peaks.bed"
– 查找名称以_peaks.bed
结尾的_peaks.bed
-
! -path "./tmp/*"
! -path "./tmp/*"
– 排除path以./tmp/
开头的所有结果 -
! -path "./scripts/*"
! -path "./scripts/*"
– 同样排除path以./scripts/
开头的所有结果
testing解决scheme:
$ mkdir abcde $ touch a/1 b/2 c/3 d/4 e/5 e/ae/b $ find . -type f ! -path "./a/*" ! -path "./b/*" ./d/4 ./c/3 ./e/a ./e/b ./e/5
你非常接近, -name
选项只考虑基本名,as -path
认为整个path=)
这是你可以做到的一种方法…
find . -type f -name "*_peaks.bed" | egrep -v "^(./tmp/|./scripts/)"
尝试类似
find . \( -type f -name \*_peaks.bed -print \) -or \( -type d -and \( -name tmp -or -name scripts \) -and -prune \)
如果我弄错了一点,不要太惊讶。 如果目标是一个exec(而不是打印),只需replace它。
对我来说,这个解决scheme并没有在一个命令执行find,不知道为什么,所以我的解决scheme是
find . -type f -path "./a/*" -prune -o -path "./b/*" -prune -o -exec gzip -f -v {} \;
解释:与sampson-chen一样加上
-prune – 忽略前进道路…
-o – 然后如果没有匹配打印结果,(修剪目录并打印剩下的结果)
18:12 $ mkdir abcde 18:13 $ touch a/1 b/2 c/3 d/4 e/5 e/ae/b 18:13 $ find . -type f -path "./a/*" -prune -o -path "./b/*" -prune -o -exec gzip -f -v {} \; gzip: . is a directory -- ignored gzip: ./a is a directory -- ignored gzip: ./b is a directory -- ignored gzip: ./c is a directory -- ignored ./c/3: 0.0% -- replaced with ./c/3.gz gzip: ./d is a directory -- ignored ./d/4: 0.0% -- replaced with ./d/4.gz gzip: ./e is a directory -- ignored ./e/5: 0.0% -- replaced with ./e/5.gz ./e/a: 0.0% -- replaced with ./e/a.gz ./e/b: 0.0% -- replaced with ./e/b.gz