elencando i file con pattern con inizio e fine


9

Voglio elencare tutti i file in una directory che inizia con "abc" e termina con ".zip"

Sto provando a usare ls.

La directory ha molti file zip che iniziano con abc<date>e xvz<date>. Voglio solo ottenere l'elenco diabc<date>.zip


ls -1 | grep "abc$(your_date).zip" ?
Stan Strum,

Risposte:


15

lsnon esegue la corrispondenza dei pattern sui nomi dei file. Elenca semplicemente il contenuto delle directory e i file che vengono forniti come argomenti.

D'altra parte, la shell ha una funzione chiamata globbing o generazione del nome file che espande un modello in un elenco di file corrispondenti a quel modello.

Qui sarebbe quel modello glob abc*.zip( *essendo un jolly che sta per qualsiasi numero di caratteri ).

Lo passeresti a qualsiasi comando ti piaccia, ad esempio printfper la stampa:

printf '%s\n' abc*.zip

Potresti anche passarlo a ls -lper visualizzare gli attributi di quei file:

ls -ld abc*.zip

(abbiamo bisogno -dperché se uno di questi file è di tipo directory , lsaltrimenti ne elencherebbe il contenuto).

O per unzipestrarli se solo fosse unzippossibile estrarre più di un file alla volta. Sfortunatamente no, quindi avresti bisogno di usare xargs -n1o un forciclo:

printf '%s\0' abc*.zip | xargs -r0n1 unzip

O:

for file in abc*.zip; do unzip "$file"; done

Ma in effetti, unzipessendo più simile a una porta di un comando MS-DOS, unzipstesso tratterà il suo argomento come un glob. In altre parole, unzip 'abc*.zip'non decomprimerai il file chiamato abc*.zip(un nome file perfettamente valido su Unix, non sui sistemi operativi Microsoft), ma i file che corrispondono al abc*.zipmodello, quindi in realtà vorresti:

 unzip 'abc*.zip'

(In realtà il nostro xargse l' forapproccio sopra sarebbe sbagliato, perché se c'è un file chiamato abc*.zipper esempio, unziplo tratterebbe come un modello! Vedere bsdtarper un modo più univoco per estrarre gli ziparchivi)


Per la corrispondenza senza distinzione tra maiuscole e minuscole, utilizzeresti in modo [aA][bB][cC]*.[zZ][iI][pP]portabile. Alcune shell hanno esteso gli operatori di globbing per la corrispondenza insensibile alle maiuscole:

  • zsh:

    setopt extendedglob
    ls -ld (#i)abc*.zip
    

    O:

    ls -ld ((#i)abc)*.zip
    

    se si desidera solo che la abcparte non faccia distinzione tra maiuscole e minuscole.

  • ksh93:

    ls -ld ~(i)abc*.zip
    

    o:

    ls -ld ~(i:abc)*.zip
    
  • con bash.

    shopt -s nocaseglob
    ls -ld abc*.zip
    

    (non c'è modo di avere solo parti del case globs sensibili lì se non usando la sintassi portatile).

  • con yash:

    set +o case-glob
    ls -ld abc*.zip
    

    stessa osservazione di cui bashsopra.


9
ls abc*.zip

Questo, tuttavia, non riuscirà se ci sono troppi file (esiste un limite all'espansione della shell in termini di quanti argomenti può espandersi).

find . -name "abc*.zip"

Questo è probabilmente il più universale. Le virgolette devono essere lì. Con alcune findimplementazioni, è anche possibile utilizzare -inameanziché la -namericerca senza distinzione tra maiuscole e minuscole ( aBc<date>.ZIPcorrisponderebbe anche).

ls | grep -x "abc.*\.zip"

Tenete presente che .*e \.poiché il filtro utilizzato da grep è regex, che è diverso dalla notazione jolly che la shell utilizza per l'espansione. Utilizzare grep -iper la ricerca senza distinzione tra maiuscole e minuscole.


1
Si noti che quel limite non è un limite di shell. È un limite del kernel nella execve()chiamata di sistema.
Stéphane Chazelas,

Dovrebbe probabilmente essere notato che findcercherà quei file anche nelle sottodirectory. Usa find . ! -name . -prune -name 'abc*.zip' -printo find . -maxdepth 1 -name 'abc*.zip'se i tuoi findsupporti -maxdepthgradiscono su GNU o BSD o find . -depth 1 -name 'abc*.zip'se findsupportano -depth <n>simili su alcuni BSD per limitarti alla directory corrente.
Stéphane Chazelas,

$ ls ../*.aha funzionato per me (elenca gli archivi nella directory principale).
Daniel,

0

Prova a usare ls abc*.zipper restringere i risultati a quelli che corrispondono ai tuoi criteri per una stringa iniziale di abc e una fine di .zip L'asterisco si espanderà per corrispondere a quei risultati senza includere caratteri iniziali xvz.


-1

È necessario specificare la directory in cui lscercare in un esempio

ls -la ~/file*.* 
ls -la ./file*.*

funziona per me, ma ovviamente non supporta la ricerca per modello


1
Questo non affronta la domanda; i file dovrebbero iniziare con abce terminare con .zip.
Jeff Schaller
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.