¿Cómo quitar "./" en unix "find"?


140
find . -type f -print

imprime

./file1
./file2
./file3

Cualquier forma de hacerlo imprimir

file1
file2
file3

?


1
si usaste -exec /path/to/myscript.sh {} en tu find, el -printf '%P\n'no funciona. En cambio, tengo que hacer el ./prefijo masticando dentro del guión:p=${1#"./"}
truthadjustr

Si lo está haciendo solo para un solo archivo:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Respuestas:


38

Si solo están en el directorio actual

find * -type f -print

¿Es eso lo que quieres?


21
Esto perderá archivos con nombres que comienzan con un punto.
Sean

2
Malo, dependiendo de la configuración de un shell * es posible que no se evalúe como archivos / directorios "ocultos", aquellos que comienzan con punto (.) Intente ejecutar este comando en su directorio de inicio, luego simplemente "encuentre -tipo f" y vea la diferencia .
Ilia K.

35
Una preocupación más relevante es que '*' es evaluado por el shell. Efectivamente tiene un tipo de situación de inyección de código malicioso. Sería trivial crear un archivo llamado '--exec rm' y otro llamado 'zzzz;'. Adiós archivos.
CWF

66
Esto no es seguro. Si un nombre de archivo comienza con un guión, se tratará como una opción para buscar, y puede fallar, o podría causar daños.
Dale Anderson

44
¿Por qué se -printrequiere? Dio el mismo resultado sin esa bandera.
user13107

239

Busque solo archivos normales en el directorio actual e imprímalos sin el ./prefijo " ":

find -type f -printf '%P\n'

De man find, descripción del -printfformato:

% P Nombre del archivo con el nombre del argumento de la línea de comando bajo el cual se encontró eliminado.


18
+1 Buena solución si su versión de findsoportes -printf(no todos lo hacen).
Todd Owen el

2
Como dijo Todd, pero más precisamente: no es POSIX 7.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8
Admitido o no, definitivamente es más seguro que la respuesta aceptada.
Dale Anderson

10
Puede usarlo en \0lugar de \nsi desea canalizarlo xargs -0(por ejemplo, en caso de que los nombres de archivo contengan espacios en blanco), por ejemplofind -type f -printf '%P\0' | xargs -0 head
seanf el

1
@Quanlong, funciona en macOS si usted brew install findutils;)
blockloop

58

Usa sed

find . | sed "s|^\./||"

2
Esta es mi solución preferida; es compatible con POSIX (funciona prácticamente en todas partes, incluso en sistemas integrados), muy corto y es poco probable que genere un comportamiento inesperado. Esta debería ser la respuesta aceptada.
Jody Bruchon

66
¿Cómo se combinaría esto find -exec?
Paul Wintz

find -exec sh -c "echo {} | sed 's|^\./||'" \; o find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

puede ser más corto

find * -type f

Es mejor 2> /dev/nullignorar el error informado cuando el comando se ejecuta en un directorio vacío.
neevek

2

Otra forma de despojar ./es usando cutlike:

find -type f | cut -c3-

Puede encontrar más explicaciones aquí.


2

Otra forma de quitar el ./

find * -type d -maxdepth 0

Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación, y probablemente resultaría en más votos positivos. Recuerde que está respondiendo la pregunta para los lectores en el futuro, no solo la persona que pregunta ahora. Edite su respuesta para agregar explicaciones y dar una indicación de qué limitaciones y supuestos se aplican.
David Buck

2

Como la -printfopción no está disponible en OSX, findaquí hay un comando que funciona en OSX find, en caso de que alguien no quiera instalar gnu findusando brewetc:

find . -type f -execdir printf '%s\n' {} + 

1
Desafortunadamente, esto elimina la ruta completa de cada archivo encontrado, incluidos los subdirectorios intermedios, y solo imprime el nombre del archivo.
PLL

1
Tienes razón. Esta solución solo es buena para archivos en el directorio actual. Para archivos anidados necesitamos usar:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.