Estoy en un script bash y quiero obtener la lista de todos los archivos (digamos todos los archivos jar). Ejecuto el comando ls -1 lib/*.jar
y obtengo el resultado:
lib/mylib_1.jar
lib/mylib_2.jar
...
¿Hay alguna opción para tener el siguiente resultado:
mylib_1.jar
mylib_2.jar
...
Hacer cd lib
antes no es una opción ya que estoy en un bucle y necesito estar en la carpeta principal para las acciones que quiero hacer dentro del bucle.
Traté de encontrar información escribiendo man ls
pero no encontré ninguna solución.
Una solución con otro comando sería buena siempre que pueda canalizarla a mi ls
comando o autosuficiente.
Respuestas:
En lugar de analizar ls , deberías usarlo
find
. Luego, también puede ejecutarbasename
en cada archivo para eliminar los directorios principales:fuente
-maxdepth
opción.Con GNU
find
no hay necesidad de ejecutarbasename
cada archivo, esto será mucho más rápido (especialmente si hay muchos archivos):fuente
¿Qué tal
(cd lib && echo *.jar)
, suponiendo que no tiene espacios en blanco o caracteres especiales en los nombres de archivo? La secuencia de comandos principal nunca cambia el directorio.fuente
printf '%s\n' *.jar
para obtener cada archivo en una línea diferente.printf '%s\0' *.jar
para eliminar problemas de espacios en blanco (aunque esta no es la Q).Como dijo Josh Jolly en su respuesta, nunca debe analizar
ls
, utilice el enfoque en su respuesta. Aún así, aquí hay unaawk
solución para eliminar las rutas de los nombres de archivo, simplemente no lo use con ls:Los
-F'/'
conjuntos separados de campos a/
lo cual significa que el último campo,$NF
, será el nombre del archivo.fuente
find
es probablemente el camino a seguir, pero si realmente, realmente haces (No) quiere quitarselib/
dels -1
, puede utilizarsed
:fuente
Puede hacer esto usando xargs con un parámetro --max-args (o el alias más corto -n):
ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename
Tenga en cuenta que lo usamos
--quoting-style=c
para asegurarnos de que los espacios en los nombres de archivo no arruinen los xargs.fuente
Una forma alternativa de resolver su consulta es enumerar todos los archivos usando
ls -R
. Combine la salida del comando ls con grep para enumerar solo archivos .jar. Puede usar el siguiente comando para hacer lo mismo con su consulta:fuente
mylib_2.jar
y filtraría archivos comolist-of-jars.txt
.find development -name '*.jar' | wc -l
->70
.ls -R development | grep jar| grep -v jar*
-> sin salida en absoluto.