使用find命令但排除两个目录中的文件

我想查找以_peaks.bed结尾的文件,但排除tmpscripts文件夹中的文件。

我的命令是这样的:

  find . -type f \( -name "*_peaks.bed" ! -name "*tmp*" ! -name "*scripts*" \) 

但它没有工作。 tmpscript文件夹中的文件仍将显示。

有没有人有这个想法?

以下是如何使用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