web-dev-qa-db-esp.com

Utilice el comando Buscar pero excluya archivos en dos directorios

Quiero encontrar archivos que terminen con _peaks.bed, pero excluir archivos en las carpetas tmp y scripts.

Mi orden es así:

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

Pero no funcionó. Los archivos en la carpeta tmp y script se seguirán mostrando.

¿Alguien tiene ideas sobre esto?

77
Hanfei Sun

Así es como puede especificar eso con find:

find . -type f -name "*_peaks.bed" ! -path "./tmp/*" ! -path "./scripts/*"

Explicación:

  • find . - Comience a buscar desde el directorio de trabajo actual (recursivamente por defecto)
  • -type f - Especifique a find que solo quiere archivos en los resultados
  • -name "*_peaks.bed" - Busca archivos con el nombre que termina en _peaks.bed
  • ! -path "./tmp/*" - Excluye todos los resultados cuya ruta comienza con ./tmp/
  • ! -path "./scripts/*" - También excluye todos los resultados cuya ruta comienza con ./scripts/

Probando la solución:

$ mkdir a b c d e
$ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
$ find . -type f ! -path "./a/*" ! -path "./b/*"

./d/4
./c/3
./e/a
./e/b
./e/5

Estabas bastante cerca, la opción -name solo considera el nombre base, mientras que -path considera la ruta completa =)

175
sampson-chen

Aquí hay una forma en que puedes hacerlo ...

find . -type f -name "*_peaks.bed" | egrep -v "^(./tmp/|./scripts/)"
8
alex

Intenta algo como

find . \( -type f -name \*_peaks.bed -print \) -or \( -type d -and \( -name tmp -or -name scripts \) -and -Prune \)

y no te sorprendas si me equivoco un poco. Si el objetivo es un ejecutivo (en lugar de imprimir), simplemente sustitúyalo en su lugar.

0
DrC

para mí, esta solución no funcionó en un comando exec con find, realmente no sé por qué, entonces mi solución es

find . -type f -path "./a/*" -Prune -o -path "./b/*" -Prune -o -exec gzip -f -v {} \;

Explicación: igual que sampson-chen uno con las adiciones de

-Prune - ignora la ruta de procedimiento de ...

-o - Entonces, si no hay coincidencia, imprima los resultados (pode los directorios e imprima los resultados restantes)

18:12 $ mkdir a b c d e
18:13 $ touch a/1 b/2 c/3 d/4 e/5 e/a e/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
0
Al3x

Puedes intentarlo a continuación:

find ./ ! \( -path ./tmp -Prune \) ! \( -path ./scripts -Prune \) -type f -name '*_peaks.bed'
0
Jacky Jiang