¿Por qué es que find
imprime un ./
resultado importante si no se dan rutas?
$ find
./file1
./file2
./file3
¿Cuál es la razón para no imprimir esto?
$ find
file1
file2
file3
La razón por la que ve esto es porque el desarrollador de GNU eligió proporcionar un comportamiento "razonable" para cuando no se proporciona ninguna ruta. Por el contrario, POSIX no indica que el parámetro es opcional:find
find
La
find
utilidad descenderá recursivamente la jerarquía de directorios de cada archivo especificado por ruta , evaluando una expresión booleana compuesta de las primarias descritas en la sección OPERANDS para cada archivo encontrado. Cada operando de ruta se evaluará sin modificaciones tal como se proporcionó, incluidos todos los<slash>
caracteres finales ; todos los nombres de ruta para otros archivos encontrados en la jerarquía consistirán en la concatenación del operando de ruta actual, a<slash>
si el operando de ruta actual no terminó en uno, y el nombre de archivo relativo al operando de ruta. La porción relativa no contendrá componentes de punto o punto-punto, no será posteriorcaracteres y solo<slash>
caracteres individuales entre componentes de nombre de ruta.
Puedes ver la diferencia en la sinopsis de cada uno. GNU tiene (como es la convención) elementos opcionales entre corchetes:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
[expression]
mientras POSIX no indica que puede ser opcional:
find [-H|-L] path... [operand_expression...]
En el programa GNU, eso se hace en ftsfind.c
:
si (vacío) { / * * Usamos una variable temporal aquí porque algunas acciones modifican * El camino temporalmente. Por lo tanto, si usamos una cadena constante, * tenemos un coredump. El mejor ejemplo de esto es si decimos * "find -printf% H" (nota, no "find. -printf% H"). * / char defaultpath [2] = "."; volver encontrar (defaultpath); }
y "."
se usa un literal para simplificar. Entonces verás el mismo resultado con
find
y
find .
porque (y POSIX está de acuerdo) la ruta dada se usará para prefijar los resultados (ver arriba para la concatenación ).
Con un poco de trabajo, se podría determinar cuándo se agregó la función por primera vez; estuvo presente en la creación inicial de "findutils" en 1996 (ver find.c
):
+ /* If no paths are given, default to ".". */
+ for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+ process_top_path (argv[i]);
+ if (i == 1)
+ process_top_path (".");
+
+ exit (exit_status);
+}
Desde el registro de cambios para encontrar 3.8, aparentemente fue
Sat Dec 15 19:01:12 1990 David J. MacKenzie (djm at egypt)
* find.c (main), util.c (usage): Make directory args optional,
defaulting to "."
Por lo general, uno realiza el procesamiento posterior de los archivos y, en ese caso, puede ser una gran ventaja comenzar con el nombre de archivo ./
. En particular, si un nombre de archivo comienza con -
, un comando posterior podría interpretar ese nombre de archivo como una opción. ./
evita eso.
Como ejemplo, considere un directorio con estos archivos:
$ ls
--link --no-clobber
Ahora, imagine cómo funcionaría este comando si los nombres de archivo se proporcionaran sin el ./
frente:
$ find -type f -exec cp -t ../ {} +
Podemos ilustrar el problema consigo find
mismo. Ejecútelo en el mismo directorio que el anterior. Los siguientes trabajos:
$ find ./*
./--link
./--no-clobber
Lo siguiente falla:
$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.
find *
.file
exigen que el usuario proporcione una ruta (como el BSD encuentra en OS X). Por lo tanto, generalmente necesita decir explícitamente algo asífind . -type f ...
. A partir de ahí, no es un gran paso para algunas versiones de find (como GNU find) simplemente predeterminar.
y dejar todo lo demás como está.find *
no se muestra.
es porque*
enumera todos los archivos y carpetas, pero excluye.
. Hagaecho *
en un directorio que contenga solo uno o dos archivos, y verá que.
no está en la lista. Por lo tanto,find *
opera en cada archivo expandido. Es lo mismo que dijistefind Desktop/
desde el directorio de inicio. Verá la salida comoDesktop/foo_bar.txt
find
comporte como lo hace. ¿Tiene alguna información de referencia autorizada para respaldar la afirmación implícita quefind
fue diseñada para comportarse de esta manera por este motivo?El
find
comando necesita ruta (s) para buscar. Si no especificamos ninguno, utiliza el directorio actual (.
) como punto de partida. Del mismo modo, si pasa el camino, por ejemplo/tmp
, lo considera como su punto de partida. Y por lo tanto los resultados.Si el directorio actual:
Si el
/tmp
directorio:Si el
abc
directorio está debajo del directorio actual:Si hay varios directorios en el directorio actual:
fuente
find
necesita una ruta para buscar cualquier cosa y que el valor predeterminado es el directorio actual. La pregunta es por qué imprime el líder./
cuandofile.txt
es igual que./file.txt
.Si no especifica una ruta, el
find
comando asume que${PWD}
es la ruta y la imprime en su salida. El usuario que no especifica la ruta no cambia la forma en quefind
funciona. Y find siempre funciona con rutas por defecto.fuente
/tmp
, entonces no lo$PWD
es ./tmp
./
/tmp
, ejecuta el comandofind /tmp
Si no especifica una ruta, siempre será el directorio actual, que es./
/tmp
. Es que no puede ser$PWD
.${PWD}
fueron lasfind .
,find $PWD
yfind
(sin una ruta, si su búsqueda lo admite).