Réponses:
ls
ne fait pas de correspondance de motifs sur les noms de fichiers. Il répertorie simplement le contenu des répertoires et les fichiers qui lui sont fournis comme arguments.
Votre shell, d'autre part, a une fonctionnalité appelée globbing ou génération de nom de fichier qui développe un modèle dans une liste de fichiers correspondant à ce modèle.
Ici, ce modèle glob serait abc*.zip
( *
étant un caractère générique qui représente n'importe quel nombre de caractères ).
Vous le passeriez à n'importe quelle commande que vous aimez, comme printf
pour l'impression:
printf '%s\n' abc*.zip
Vous pouvez également le transmettre à ls -l
pour afficher les attributs de ces fichiers:
ls -ld abc*.zip
(nous en avons besoin -d
car si l'un de ces fichiers est de type répertoire , ls
il listerait leur contenu autrement).
Ou pour unzip
les extraire si seulement ils unzip
pouvaient extraire plus d'un fichier à la fois. Malheureusement, ce n'est pas le cas, vous devez donc utiliser xargs -n1
soit une for
boucle:
printf '%s\0' abc*.zip | xargs -r0n1 unzip
Ou:
for file in abc*.zip; do unzip "$file"; done
Mais en fait, unzip
étant plus comme un port d'une commande MS-DOS, unzip
lui-même traiterait son argument comme un glob. En d'autres termes, unzip 'abc*.zip'
ne décompressera pas le fichier appelé abc*.zip
(un nom de fichier parfaitement valide sur Unix, pas sur les systèmes d'exploitation Microsoft), mais les fichiers correspondant au abc*.zip
modèle, vous voudrez donc réellement:
unzip 'abc*.zip'
( En fait , notre xargs
et for
approche ci - dessus serait une erreur, parce que s'il y a un fichier appelé abc*.zip
par exemple, unzip
traiterait comme un modèle! Voir bsdtar
une façon plus unixy pour extraire les zip
archives)
Pour une correspondance insensible à la casse, vous utiliseriez de manière [aA][bB][cC]*.[zZ][iI][pP]
portable. Certains shells ont des opérateurs globbing étendus pour une correspondance insensible à la casse:
zsh
:
setopt extendedglob
ls -ld (#i)abc*.zip
Ou:
ls -ld ((#i)abc)*.zip
si vous souhaitez que la abc
pièce soit insensible à la casse.
ksh93
:
ls -ld ~(i)abc*.zip
ou:
ls -ld ~(i:abc)*.zip
avec bash
.
shopt -s nocaseglob
ls -ld abc*.zip
(aucun moyen d'y avoir seulement des parties des globes sensibles à la casse autrement qu'en utilisant la syntaxe portable).
avec yash
:
set +o case-glob
ls -ld abc*.zip
même remarque que bash
ci-dessus.
ls abc*.zip
Cependant, cela échouera s'il y a trop de fichiers (il y a une limite à l'expansion du shell en termes de nombre d'arguments vers lesquels il peut s'étendre).
find . -name "abc*.zip"
C'est probablement le plus universel. Les citations doivent être là. Avec certaines find
implémentations, vous pouvez également utiliser -iname
au lieu de -name
pour la recherche insensible à la casse ( aBc<date>.ZIP
correspondrait également).
ls | grep -x "abc.*\.zip"
Attention au .*
et \.
puisque le filtre utilisé par grep est regex qui est différent de la notation générique que le shell utilise pour l'expansion. À utiliser grep -i
pour la recherche insensible à la casse.
execve()
appel système.
find
ces fichiers seront également recherchés dans les sous-répertoires. Utilisez find . ! -name . -prune -name 'abc*.zip' -print
ou find . -maxdepth 1 -name 'abc*.zip'
si vos find
supports -maxdepth
comme sur GNU ou BSD ou find . -depth 1 -name 'abc*.zip'
si vos find
supports -depth <n>
comme sur certains BSD pour restreindre au répertoire courant.
$ ls ../*.a
travaillé pour moi (liste des archives dans le répertoire parent).
Vous devez spécifier le répertoire où ls
va chercher dans un exemple
ls -la ~/file*.*
ls -la ./file*.*
cela fonctionne pour moi, mais évidemment, il ne prend pas en charge la recherche par modèle
abc
et se terminer par .zip
.
ls -1 | grep "abc$(your_date).zip"
?