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/.\//}
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.
+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;)
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|^\./||' <<< '{}'" \;
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:
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' {} +
-exec /path/to/myscript.sh {}
en tufind
, el-printf '%P\n'
no funciona. En cambio, tengo que hacer el./
prefijo masticando dentro del guión:p=${1#"./"}
f=`find . -name migration`; echo ${f/.\//}
Respuestas:
Si solo están en el directorio actual
find * -type f -print
¿Es eso lo que quieres?
fuente
-print
requiere? Dio el mismo resultado sin esa bandera.Busque solo archivos normales en el directorio actual e imprímalos sin el
./
prefijo " ":De man find, descripción del
-printf
formato:fuente
find
soportes-printf
(no todos lo hacen).\0
lugar de\n
si desea canalizarloxargs -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
brew install findutils
;)Usa sed
fuente
find -exec
?find -exec sh -c "echo {} | sed 's|^\./||'" \;
ofind -exec sh -c "sed 's|^\./||' <<< '{}'" \;
puede ser más corto
fuente
2> /dev/null
ignorar el error informado cuando el comando se ejecuta en un directorio vacío.Otra forma de despojar
./
es usandocut
like:Puede encontrar más explicaciones aquí.
fuente
Otra forma de quitar el ./
fuente
Como la
-printf
opción no está disponible en OSX,find
aquí hay un comando que funciona en OSX find, en caso de que alguien no quiera instalargnu find
usandobrew
etc:fuente
find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +