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?
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 =)
Aquí hay una forma en que puedes hacerlo ...
find . -type f -name "*_peaks.bed" | egrep -v "^(./tmp/|./scripts/)"
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.
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
Puedes intentarlo a continuación:
find ./ ! \( -path ./tmp -Prune \) ! \( -path ./scripts -Prune \) -type f -name '*_peaks.bed'