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

140
find . -type f -print

imprime

./file1
./file2
./file3

Cualquier forma de hacerlo imprimir

file1
file2
file3

?

breadjesus
fuente
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?

Tim Green
fuente
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.

Ilia K.
fuente
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|^\./||"
Lie Ryan
fuente
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
ghostdog74
fuente
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í.

banjoAtix
fuente
2

Otra forma de quitar el ./

find * -type d -maxdepth 0
Valheru
fuente
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' {} + 
anubhava
fuente
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