Estaba confundido en cuanto a por qué los directorios podados también estaban siendo impresos por el findcomando, y algunos otros detalles intrincados de cómo -prunefuncionaba, pero pude resolverlo con algunos ejemplos.
Para ejecutar los siguientes ejemplos, cree los siguientes directorios y archivos.
mkdir aa
mkdir bb
touch file1
touch aa/file1
touch bb/file3
Para crear esta estructura:
$ tree
.
├── aa
│ └── file1
├── bb
│ └── file3
└── file1
Ahora use find para buscar directorios con nombre aa. No hay problema aqui.
$ find . -type d -name aa
./aa
Busque todos los directorios que no sean aa y obtenemos el directorio actual .y ./bb, que también tiene sentido.
$ find . -type d ! -name aa
.
./bb
Hasta ahora todo bien, pero cuando usamos -prune, find devuelve el directorio que estamos podando, lo que inicialmente me confundió porque esperaba que devolviera todos los otros directorios y no el que se estaba podando.
$ find . -type d -name aa -prune
./aa
La razón por la que devuelve el directorio que se está podando se explica, no en la -prunesección de las páginas del manual como se indica en la respuesta de Timo , sino en la EXPRESSIONSsección:
Si la expresión no contiene otras acciones -prune,
-printse realiza en todos los archivos para los que la expresión es verdadera.
lo que significa que, dado que la expresión coincide con el aanombre del directorio, la expresión se evaluará como verdadera y se imprimirá porque find agrega implícitamente -printa al final de todo el comando. Sin -printembargo, no agregará a si agrega deliberadamente la acción -o -printal final usted mismo:
find . -type d -name aa -prune -o -print
.
./file1
./bb
./bb/file3
Aquí el comando find NO agrega más un implícito -print, por lo que el directorio que estamos podando ( aa) no se imprimirá.
Entonces, finalmente, si agregamos una cláusula que busca archivos con un patrón de nombre de archivo file*después de -o, entonces debe colocar un -printal final de esa segunda cláusula como esta:
find . \( -type d -name aa -prune \) -o \( -type f -name 'file*' -print \)
./file1
./bb/file3
La razón por la que esto funciona es la misma: si no coloca un -printen la segunda cláusula, ya que no hay otra acción que no sea la -pruneacción, find agregará -printautomáticamente al final del comando, haciendo que la -prunecláusula imprima el directorio podado:
find . \( \( -type d -name aa -prune \) -o \( -type f -name 'file*' \) \) -print
./aa
./file1
./bb/file3
En general, debe colocar el -printcomando en la segunda cláusula. Si lo coloca en el medio como lo hizo el póster original, no funcionará correctamente porque los archivos que se están podando se imprimirán de inmediato y la segunda cláusula no tendrá la oportunidad de elegir los archivos que desea:
find . \( -type d -name aa -prune -o -print \) -o \( -type f -name 'file*' \)
.
./file1
./bb
./bb/file3
Así que desafortunadamente, el póster original recibió el comando incorrecto arriba al colocarlo -printen el lugar equivocado. Podría haber funcionado para su caso específico, pero no funciona en el caso general.
Hay miles de personas que tienen dificultades para entender cómo -prunefunciona. La findpágina de manual debe actualizarse para evitar la interminable confusión mundial sobre este comando.
-print, de lo contrario, lo implícito se-printaplica a toda la condición