¿Cómo hago para que "buscar" excluya la carpeta en la que busca?

12

Estoy ejecutando el siguiente comando:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

Me gustaría eliminar todas las carpetas debajo de la processingcarpeta (la carpeta de procesamiento nunca debe eliminarse).

El comando también está eliminando la processingcarpeta. ¿Cómo limito el script para eliminar solo las carpetas de esa carpeta?

Elad Dotan
fuente
1
posterity: stackoverflow.com/questions/13525004/…
Trevor Boyd Smith

Respuestas:

25

La forma más sencilla sería simplemente agregar -mindepth 1, lo que omitirá la primera jerarquía de profundidad y , por lo tanto, omitirá el directorio principal.

Además, no necesita una -execllamada adicional a rm, puede simplemente deletelas carpetas directamente si están vacías.

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

Si no están vacíos:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

Si eres flojo, también puedes expandir un comodín. Como *no incluye el directorio actual de forma predeterminada (a menos que dotglobesté configurado ), también puede hacer:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

Sin embargo, esto tampoco incluiría carpetas ocultas, nuevamente debido a la dotglobopción.

slhck
fuente
Hola, obtengo "find: advertencia: ha especificado la opción -mindepth después de un tipo de argumento sin opción, pero las opciones no son posicionales (-mindepth afecta las pruebas especificadas antes y las especificadas después). Especifique las opciones antes de otros argumentos "y también" find: no se puede eliminar `/ folder / 50d82faf0e09e ': el directorio no está vacío"
Elad Dotan
Agregue mindepth antes de escribir entonces. Para eliminar los directorios cuando no están vacíos, puede seguir con el enfoque rm que tenía originalmente.
slhck
4

El problema es que find devuelve el directorio actual (.) Junto con los otros directorios, por lo que elimina la carpeta de procesamiento y los subdirectorios. Una forma rápida de evitar eso sería agregar la opción

-not -name .

que detiene la salida del directorio actual y, a su vez, evita que se elimine.

Eso funcionaría si estuviera ejecutando el comando dentro del directorio de procesamiento, para tener en cuenta el hecho de que está utilizando una ruta absoluta:

-not -name /var/www/html/content/processing

Y todo el comando sería:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;
Xenopático
fuente
El último comando está equivocado. -namese refiere a basename, nunca coincide con nada con una barra inclinada. Probablemente necesites usar -path.
Kamil Maciorowski
1

Ya respondido, aún me gustaría enumerar otro enfoque.

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

Esto excluirá el directorio superior (y también los subdirectorios), y ahora puede aplicar cualquier comando que queramos aplicar sobre él.

>> Opciones:
-mindepth 1: para excluir el directorio raíz
-maxdepth 1: para evitar analizar subdirectorios. (Para un escenario particular como el cuestionado, no necesita esto).
-type d: Lista solo los tipos de directorio. Esta opción debería aparecer después de usar mindepth maxdepth.

prashant
fuente
¿Por qué -maxdepth 1? ¿Por qué -type ddos veces? ¿Cómo es esto diferente a la respuesta aceptada?
Attie
@Attie: Gracias, corrigió el error. maxdepth no es necesario, pero sería útil si desea evitar enumerar subdirectorios.
prashant