È possibile rimuovere il prefisso della cartella da un comando `ls`


12

Sono in uno script bash e voglio ottenere l'elenco di tutti i file (diciamo tutti i file jar). Eseguo il comando ls -1 lib/*.jare ottengo l'output:

lib/mylib_1.jar
lib/mylib_2.jar
...

C'è qualche opzione per avere il seguente output:

mylib_1.jar
mylib_2.jar
...

Fare cd libprima non è un'opzione poiché sono in un ciclo e devo essere nella cartella principale per le azioni che voglio fare all'interno del ciclo.

Ho provato a trovare informazioni digitando man lsma non ho trovato alcuna soluzione.

Una soluzione con un altro comando sarebbe buona fintanto che posso convogliarla al mio lscomando o autosufficiente.


Cosa stai facendo con i nomi di quei file? Li stai semplicemente elencando sul terminale o li stai passando a un altro programma o script (singolarmente o come elenco)? Il modo corretto di gestirlo dipende da come vengono usati i nomi dei file.
Kusalananda

L'idea era di fare alcune statistiche sulle librerie di terze parti su un progetto java multi-modulo. Volevo solo la lista e fare una sorta di uniq e dopo
рüффп

Risposte:


19

Invece di analizzare ls dovresti usare findinvece. Quindi è anche possibile eseguire basenamesu ogni file per eliminare le directory principali:

find lib/ -name '*.jar' -exec basename {} \;

Ok, questo modo è perfetto anche per me.
рüффп,

3
Vedi anche l' -maxdepthopzione.

13

Con GNU findnon è necessario eseguire basenameper ogni singolo file, questo sarà molto più veloce (specialmente se ci sono molti file):

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

11

Che ne dici (cd lib && echo *.jar), supponendo che non hai spazi bianchi o caratteri speciali nei nomi dei file. Lo script padre non cambia mai la directory.


Neanche gli spazi saranno un problema.
terdon

Questa è una buona idea e probabilmente sarà l'opzione più veloce. Farei comunque printf '%s\n' *.jarper ottenere ogni file su una riga diversa.
Graeme,

O anche printf '%s\0' *.jarper eliminare i problemi di spazi bianchi (anche se questa non è la Q).
Graeme,

5

Come ha detto Josh Jolly nella sua risposta, non dovresti mai analizzare ls, usa invece l'approccio nella sua risposta. Tuttavia, ecco una awksoluzione per rimuovere i percorsi dai nomi dei file, ma non usarli con ls:

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

I -F'/'set il separatore di campo per /il che significa che l'ultimo campo, $NF, sarà il nome del file.


1

findè probabilmente la strada da percorrere, ma se davvero, davvero (non vuoi) toglierti lib/di mezzo ls -1, puoi usare sed:

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

0

Puoi farlo usando xargs con un parametro --max-args (o l'alias più 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

Nota che usiamo --quoting-style=cper assicurarci che gli spazi nei nomi dei file non rovinino gli xargs.


Non me ne sono accorto. Grazie! Ho trovato questa gemma su un altro scambio di stack. Puoi introdurre le virgolette ai risultati di ls con --quoting-style = c. Quindi il comando completo risultante sarebbe: `ls --quoting-style = c -1 lib / *. Jar | xargs --max-args 1 basename`
yoni

-1

Un modo alternativo di risolvere la tua query è elencare tutti i file usando ls -R. Combina l'output del comando ls con grep per elencare solo i file .jar. È possibile utilizzare il comando seguente per fare lo stesso per la query:

ls -R lib | grep jar| grep -v jar*

Ciò fallirebbe gravemente se ci fosse una sottodirectory che contiene anche file jar o un file chiamato ad esempio "list-of-jars.txt".
Jules,

grep -v jar * filtrerebbe i risultati con un file chiamato come il tuo esempio citato.
joshi.mohit86,

vero. filtrerebbe anche tutti i file previsti. Ora lo guardo di nuovo, non vedo alcuna circostanza in cui il comando che suggerisci in realtà produrrebbe alcun output ...
Jules

No, visualizzerebbe file simili mylib_2.jare filtrerebbe i file simili list-of-jars.txt.
joshi.mohit86,

No, non lo fa. L'ho appena provato. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> nessuna uscita.
Jules,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.