¿Es posible eliminar el prefijo de carpeta de un comando `ls`

12

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/*.jary 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 libantes 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 lspero no encontré ninguna solución.

Una solución con otro comando sería buena siempre que pueda canalizarla a mi lscomando o autosuficiente.

рüффп
fuente
¿Qué haces con los nombres de esos archivos? ¿Los está listando en la terminal o los está pasando a otro programa o script (individualmente o como una lista)? La forma correcta de manejar esto depende de cómo se usen los nombres de archivo.
Kusalananda
La idea era hacer algunas estadísticas sobre librerías de terceros en un proyecto Java de módulos múltiples. Solo quería la lista y hacer una especie y uniq después
рüффп

Respuestas:

19

En lugar de analizar ls , deberías usarlo find. Luego, también puede ejecutar basenameen cada archivo para eliminar los directorios principales:

find lib/ -name '*.jar' -exec basename {} \;
Josh Jolly
fuente
Ok, este camino también es perfecto para mí.
Febrero
3
Ver también la -maxdepthopción.
13

Con GNU findno hay necesidad de ejecutar basenamecada archivo, esto será mucho más rápido (especialmente si hay muchos archivos):

find lib -name '*.jar' -printf '%P\n'
Graeme
fuente
11

¿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.

doneal24
fuente
Los espacios tampoco serán un problema.
terdon
Esta es una buena idea y probablemente será la opción más rápida. Sin embargo, haría lo posible printf '%s\n' *.jarpara obtener cada archivo en una línea diferente.
Graeme
O incluso printf '%s\0' *.jarpara eliminar problemas de espacios en blanco (aunque esta no es la Q).
Graeme
5

Como dijo Josh Jolly en su respuesta, nunca debe analizar ls, utilice el enfoque en su respuesta. Aún así, aquí hay una awksolución para eliminar las rutas de los nombres de archivo, simplemente no lo use con ls:

find . | awk -F'/' '{print $NF}'

Los -F'/'conjuntos separados de campos a /lo cual significa que el último campo, $NF, será el nombre del archivo.

terdon
fuente
1

findes probablemente el camino a seguir, pero si realmente, realmente haces (No) quiere quitarse lib/de ls -1, puede utilizar sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

fuente
0

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=cpara asegurarnos de que los espacios en los nombres de archivo no arruinen los xargs.

yoni
fuente
No me di cuenta de eso. ¡Gracias! Encontré esta gema en otro intercambio de pila. Puede introducir comillas a los resultados de ls con --quoting-style = c. Entonces el comando completo resultante sería: `ls --quoting-style = c -1 lib / *. Jar | xargs --max-args 1 basename`
yoni
-1

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:

ls -R lib | grep jar| grep -v jar*
joshi.mohit86
fuente
Esto fallaría gravemente si hubiera un subdirectorio que también contiene archivos jar, o un archivo llamado por ejemplo "list-of-jars.txt".
Jules
grep -v jar * filtraría los resultados con un archivo denominado como el ejemplo citado.
joshi.mohit86
cierto. también filtraría todos los archivos previstos. Ahora que lo veo de nuevo, no veo circunstancias en las que el comando que sugiera realmente produzca resultados ...
Jules
No, mostraría archivos como mylib_2.jary filtraría archivos como list-of-jars.txt.
joshi.mohit86
No lo hace Solo lo intenté. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> sin salida en absoluto.
Julio