Estoy utilizando find
para localizar y eliminar archivos de copia de seguridad, pero deseo excluir ciertos directorios de la búsqueda. Los nombres de los archivos de copia de seguridad podrían terminar en .bck
, bak
, ~
, o backup
.
El código de Ejemplo de trabajo mínimo (MWE) con solo tres directorios para excluir es:
#! /bin/bash
find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put
La sintaxis \( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
parece un poco torpe, especialmente si hay alrededor de diez directorios para excluir, aunque solo he mostrado tres en el MWE.
¿Hay alguna forma más elegante de usar un archivo de entrada, con la lista de directorios excluidos, o una construcción tipo matriz o de lista, que podría ser puesta en servicio?
Lamento no haber sido más explícito cuando escribí mi pregunta original.
NB: trash-put
es una utilidad que mueve los archivos al en Trashcan
lugar de eliminarlos [1].
Con GNU find (es decir, bajo Linux no integrado o Cygwin), puede usar
-regex
para combinar todos estos-path
comodines en una sola expresión regular.Con FreeBSD u OSX, use en
-E
lugar de-regextype posix-extended
.fuente
Agrupe
-path ... -prune
en una expresión encerrada\( ... \)
usando-o
( o ) lógica.El ejemplo directorios o archivos en o bajo no iterar
/somepath/a
,/somepath/b
y/somepath/c
.Aquí hay un ejemplo más específico que usa múltiples acciones.
fuente
Esto parece ser más una pregunta de concha que una
find
pregunta. Con un archivo que contiene( -name dir1 -o -name dir2 ) -prune
(¡no "\"!) Simplemente puede hacer esto:Sin
eval find
embargo, sin cambiar la llamada de búsqueda en sí ( ao cambiando $ IFS), esto funciona solo con rutas sin espacios en blanco.Si desea mantener el archivo más simple, puede escribir un script.
Y use
en lugar.
fuente
-name
bypath
).\( -path "dir1" -o -path "dir2" ... -o -path "dirN" \) -prune
excluir ciertos directorios de la búsqueda recursiva que lofind
hace. No busco nada dentro de los archivos, sino que elimino ciertos archivos y evito ciertos directorios en mi ruta de búsqueda. Tampoco entiendo lo que tu script intenta hacer. Entonces, parece que tenemos una falta de comunicación. Lo siento. Dejémoslo así.