Risposte:
ls
non 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 printf
per la stampa:
printf '%s\n' abc*.zip
Potresti anche passarlo a ls -l
per visualizzare gli attributi di quei file:
ls -ld abc*.zip
(abbiamo bisogno -d
perché se uno di questi file è di tipo directory , ls
altrimenti ne elencherebbe il contenuto).
O per unzip
estrarli se solo fosse unzip
possibile estrarre più di un file alla volta. Sfortunatamente no, quindi avresti bisogno di usare xargs -n1
o un for
ciclo:
printf '%s\0' abc*.zip | xargs -r0n1 unzip
O:
for file in abc*.zip; do unzip "$file"; done
Ma in effetti, unzip
essendo più simile a una porta di un comando MS-DOS, unzip
stesso 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*.zip
modello, quindi in realtà vorresti:
unzip 'abc*.zip'
(In realtà il nostro xargs
e l' for
approccio sopra sarebbe sbagliato, perché se c'è un file chiamato abc*.zip
per esempio, unzip
lo tratterebbe come un modello! Vedere bsdtar
per un modo più univoco per estrarre gli zip
archivi)
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 abc
parte 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 bash
sopra.
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 find
implementazioni, è anche possibile utilizzare -iname
anziché la -name
ricerca senza distinzione tra maiuscole e minuscole ( aBc<date>.ZIP
corrisponderebbe 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 -i
per la ricerca senza distinzione tra maiuscole e minuscole.
execve()
chiamata di sistema.
find
cercherà quei file anche nelle sottodirectory. Usa find . ! -name . -prune -name 'abc*.zip' -print
o find . -maxdepth 1 -name 'abc*.zip'
se i tuoi find
supporti -maxdepth
gradiscono su GNU o BSD o find . -depth 1 -name 'abc*.zip'
se find
supportano -depth <n>
simili su alcuni BSD per limitarti alla directory corrente.
$ ls ../*.a
ha funzionato per me (elenca gli archivi nella directory principale).
È necessario specificare la directory in cui ls
cercare in un esempio
ls -la ~/file*.*
ls -la ./file*.*
funziona per me, ma ovviamente non supporta la ricerca per modello
abc
e terminare con .zip
.
ls -1 | grep "abc$(your_date).zip"
?