
Me gusta usar el siguiente comando para imprimir nombres de archivos pero los imprime con extensiones.
find . -type f -printf '%f\n'
En mi directorio hay muchos archivos con diferentes extensiones. Intenté agregar --ignore='*.*'
antes y después -printf
, pero no funcionó. ejemplo; Tengo archivos myfile1.txt, myfile2.mp3, etc. Necesito que imprima myfile1, myfile2, etc. ¿Cómo haría esto?
Respuesta1
Si te entiendo correctamente (No lo hice, mira la segunda parte de la respuesta.), desea evitar enumerar nombres de archivos que contengan un carácter de punto.
Esto hará eso:
find . -type f ! -name '*.*'
El patrón global del nombre de archivo *.*
coincidiría con cualquier nombre de archivo que contenga al menos un punto. Lo anterior !
niega el sentido de la coincidencia, lo que significa que los nombres de ruta que lleguen hasta el final serán aquellos de archivos que no tengan puntos en sus nombres. Enrealmente antiguoshells, es posible que desee escapar del !
as \!
(o actualizar su instalación de Unix). El solitario !
no invocarábash
La historia de las instalaciones de expansión..
Para imprimir solo el componente del nombre de archivo de la ruta encontrada, con GNU find
:
find . -type f ! -name '*.*' -printf '%f\n'
Con estándar find
(o GNU find
para el caso):
find . -type f ! -name '*.*' -exec basename {} \;
Antes de usar esto en una sustitución de comando en un bucle, consulte "¿Por qué es una mala práctica recorrer la salida de Find?".
Para enumerar todos los nombres de archivos y, al mismo tiempo, eliminar todo lo que esté después del último punto del nombre ("eliminar la extensión"), puede utilizar
find . -type f -exec sh -c '
for pathname do
pathname=$( basename "$pathname" )
printf "%s\n" "${pathname%.*}"
done' sh {} +
Esto enviaría todos los nombres de ruta encontrados de todos los archivos a un bucle de shell corto. El bucle tomaría cada nombre de ruta y basename
lo llamaría para extraer el componente de nombre de archivo del nombre de ruta, y luego imprimiría la cadena resultante con todo lo que hay después del último punto eliminado.
La expansión del parámetro ${pathname%.*}
significa "eliminar la cadena más corta que coincida .*
(un punto literal seguido de texto arbitrario) del final del valor de $pathname
". Tendría el efecto de eliminar un sufijo de nombre de archivo después del último punto del nombre de archivo.
Para obtener más información sobre find ... -exec ... {} +
, consulte, por ejemplo, "Comprender la opción -exec de "buscar"".
Respuesta2
En Linux, no existen las extensiones de archivo. A .
en un nombre de archivo no tiene significado alguno (a pesar de que a .
como nombreprimerocarácter en un nombre de archivo lo identifica como un archivo oculto).
Además, consultar la página del manual find
de mi sistema no muestra ninguna --ignore
opción.
Dicho esto, si desea ignorar cualquier archivo que tenga a .
en su nombre, puede usar find
el operador ' -not
:
find -type f -not -name '*.*' -print
Respuesta3
Como han señalado otros, las "extensiones" realmente no significan nada para los sistemas Unix. Pero podemos eliminarlos de un listado con un simple sed
comando.
p.ej
find * -type f -print | sed 's/\.[^.]*$//'
Si hay directorios y no desea que se muestren en el listado, entonces
find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'
Para un solo directorio podemos usar ls
en lugar defind
ls | sed 's/\.[^.]*$//'
Respuesta4
intentar
find . -type f \! -name '*.*' -print
dónde
\!
: no (! debe escaparse)name '*.*'
: nombre de archivo con extensión