En general, la cadena vacía no denota el directorio actual, ni a los comandos de shell ni a las llamadas del sistema. Lo hizo en algunos sistemas más antiguos, pero no en los sistemas compatibles con POSIX .
Ocasionalmente encontrará un programa que usa el directorio actual cuando pasa una cadena vacía y el programa espera un nombre de directorio. Esto a veces es deliberado, y a veces es un efecto secundario de anteponer la ruta absoluta del directorio actual cuando la cadena dada no comienza con una barra inclinada.
Lo mejor para ti sería dejar el ./
. No hace ningún daño.
Si la lista de archivos es para
find . … | sed 's!^\./!!'
Tenga en cuenta que esto altera algunos nombres de archivo que contienen nuevas líneas. Esto generalmente no es un problema para el consumo humano, y la producción de find
no es adecuada para el consumo del programa, ya que es ambigua. Si está utilizando -print0
, que es adecuado para el consumo del programa, probablemente no le importe el ./
prefijo de todos modos.
Puede usar en find * …
lugar de find . …
, pero tenga en cuenta que find *
tiene una serie de defectos que lo hacen inadecuado en general:
.
se omite.
.
Se omiten todos los archivos de puntos (archivos cuyo nombre comienza con o ..`).
- Si hay un nombre de archivo en el directorio actual cuyo nombre comienza con
-
(o un archivo llamado !
o (
...), será interpretado como una opción o predicado por find
.
El primer punto no importa si su filtro excluye el directorio actual. Para el segundo punto, puede usar los patrones ..?* .[!.]* *
para hacer coincidir todos los archivos en el directorio actual, pero deberá verificar si cada patrón coincide con al menos un archivo y omitirlo si no lo hace. Esto es posible pero muy engorroso. El último punto es un tapón. Por find *
lo tanto, puede ser adecuado para el uso rápido de la línea de comandos, pero no lo use en un script.
Un enfoque alternativo es utilizar la función de engrosamiento recursivo del shell, p. Ej.
printf '%s\n' **/*.h
Esto debe activarse shopt -s globstar
en bash y set -o globstar
en ksh93, y no existe en un shell POSIX básico como el guión. Los archivos de puntos no se atravesarán de forma predeterminada; para incluirlos, primero haga que el globbing no ignore los archivos de puntos shopt -s dotglob
en bash o FIGNORE='@(.|..)'
en ksh93. Además, si no hay coincidencias, este comando imprime el patrón; ejecuta shopt -s nullglob
en bash para imprimir una línea vacía en su lugar, y usa el patrón ~(N)**/*.h
en ksh.
En zsh, el bloqueo recursivo está activado de forma predeterminada. Use el calificador global D
para incluir archivos de puntos e N
imprimir una línea vacía si no hay coincidencias (de manera predeterminada, zsh arroja un error si un patrón no coincide con ningún archivo). Puedes usar printf
como arriba o
print -rl -- **/*.h(DN)
find
tiene el parámetro -printf para manipular cómo se muestran los resultados.find . -name '*.h' -printf '%P\n'
eliminará el./
prefijo Mira lo quefind . -name '*.h' -print
hace.