¿Cuál es la diferencia entre find? y encontrar . -impresión

27

Cuál es la diferencia entre:

find .

y

find . -print

¿Qué hace -printrealmente?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
faressoft
fuente

Respuestas:

41

Desde la página del findutils findmanual :

Si no se da ninguna expresión, -printse usa la expresión (pero probablemente debería considerar usarla -print0, de todos modos).

( -printes una findexpresión)

La documentación POSIX confirma esto:

Si no hay una expresión presente, -print se utilizará como expresión.

Entonces find .es exactamente equivalente a find . -print; el primero no tiene expresión, por lo que -printse agrega internamente.

La explicación de lo que -printhace viene más abajo en la página de manual:

-print

Cierto; imprima el nombre completo del archivo en la salida estándar, seguido de una nueva línea. Si está canalizando la salida de find a otro programa y existe la menor posibilidad de que los archivos que está buscando puedan contener una nueva línea, entonces debería considerar seriamente usar la -print0opción en lugar de -print. Consulte la sección de NOMBRES DE ARCHIVO INUSUALES para obtener información sobre cómo se manejan los caracteres inusuales en los nombres de archivo.

Stephen Kitt
fuente
Una especie de pregunta de nivel principiante, pero ¿de qué expresión estás hablando? es esta expresión regular?
Rishi Prakash
2
@Rishi ve la página de manual .
Stephen Kitt el
20

-printEs la acción por defecto . Algunos findpredicados se consideran acciones en lugar de filtros o condiciones . Por ejemplo, -type fno es una acción. -execes una acción aunque también se puede usar como condición.

Las acciones incluyen -print, -execy -ok. Algunas findimplementaciones tienen otros predicados de acción no estándar como el -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Donde ninguna de las acciones<some-predicates> contener es equivalente a:

find files \( <some-predicates> \) -print

(tenga en cuenta los paréntesis anteriores que son importantes si hay algunos -ooperadores).

En caso de duda, lo mejor es usar -printexplícitamente (o -exec printf '%s\0' {} +(o -print0cuando esté disponible) para que la salida pueda ser procesada posteriormente).

La -printacción predeterminada es especificada por POSIX. Algunas findimplementaciones antiguas requerían una explícita-print , pero por lo general no se encuentran en la actualidad.

También tenga en cuenta que algunas findimplementaciones permiten omitir el files, en cuyo caso prefieren buscar en el directorio actual. Es decir, para ellos

find

es equivalente a

find .
find . -print

Sin embargo, eso no es estándar, por lo que es mejor evitarlo.

En el extremo más detallado (y útil) del espectro, algunas findimplementaciones también permiten pasar rutas de archivos como argumento a una -fopción como en:

find -f "$file1" -f "$file2" -print

Son las únicas findimplementaciones que permiten pasar rutas de archivos arbitrarias a find. Otras implementaciones no pueden aceptar rutas de archivos como !o -print... entonces find "$file" -print(o incluso find -- "$file" -print) supone $fileque no es el nombre de un findpredicado (u opción en el primer caso).

Desafortunadamente, eso tampoco es estándar ni portátil.

Stéphane Chazelas
fuente
Si no es estándar y es mejor evitarlo, ¿por qué nombrarlo?
Isaac
@ Isaac, porque pueden ser útiles / son posibles errores tipográficos ...
vonbrand
8

Son lo mismo, ambos escriben toda la jerarquía de directorios desde el directorio actual.

Desde POSIX busque documentación :

Los siguientes comandos son equivalentes:

encontrar .

encontrar . -impresión

Cuonglm
fuente
4

En Linux no hay diferencia, pero otros sistemas (como AIX, por ejemplo) lo necesitan -printsi desea que la salida del comando se muestre en su pantalla.

YoMismo
fuente
3
Eso sería versiones muy muy antiguas de AIX entonces. AIX 4.3 findno lo necesita. AIX ha sido POSIX conforme por décadas.
Stéphane Chazelas
3

Durante muchos años, el comando find no tuvo una acción predeterminada. Un error común fue olvidar agregar la opción -print a su comando de búsqueda. Todavía hoy en día lo escribo por costumbre.

Pero en algún momento se añade como la acción por defecto por lo que ahora find ., y find . -printson equivalentes.

Kevin
fuente
1

A veces es útil usarlo -printexplícitamente cuando está realizando otra acción para que el nombre del archivo se muestre a medida que se realiza esa acción.

find . -print -delete

sería similar a

rm -rfv *

donde -printcorresponde a -v. Si no incluye -print, los nombres de los archivos no se muestran.

Para que el rmcomando sea aún más similar, por cierto, emita primero este comando Bash

shopt -s dotglob

lo que hará que los *archivos de puntos coincidentes (ocultos).

Pausado hasta nuevo aviso.
fuente