Je souhaite répertorier tous les fichiers d'un répertoire commençant par «abc» et se terminant par «.zip»
J'essaye d'utiliser ls
.
Le répertoire contient de nombreux fichiers zip commençant par abc<date>
et xvz<date>
. Je veux seulement obtenir la liste desabc<date>.zip
ls -1 | grep "abc$(your_date).zip"
?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:Vous pouvez également le transmettre à
ls -l
pour afficher les attributs de ces fichiers:(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 ilsunzip
pouvaient extraire plus d'un fichier à la fois. Malheureusement, ce n'est pas le cas, vous devez donc utiliserxargs -n1
soit unefor
boucle:Ou:
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 auabc*.zip
modèle, vous voudrez donc réellement:( En fait , notre
xargs
etfor
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! Voirbsdtar
une façon plus unixy pour extraire leszip
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
:Ou:
si vous souhaitez que la
abc
pièce soit insensible à la casse.ksh93
:ou:
avec
bash
.(aucun moyen d'y avoir seulement des parties des globes sensibles à la casse autrement qu'en utilisant la syntaxe portable).
avec
yash
:même remarque que
bash
ci-dessus.la source
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).
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).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. À utilisergrep -i
pour la recherche insensible à la casse.la source
execve()
appel système.find
ces fichiers seront également recherchés dans les sous-répertoires. Utilisezfind . ! -name . -prune -name 'abc*.zip' -print
oufind . -maxdepth 1 -name 'abc*.zip'
si vosfind
supports-maxdepth
comme sur GNU ou BSD oufind . -depth 1 -name 'abc*.zip'
si vosfind
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).Essayez d'utiliser
ls abc*.zip
pour restreindre les résultats à ceux correspondant à vos critères pour une chaîne de départ abc et une fin de .zip L'astérisque se développera pour correspondre à ces résultats sans inclure les caractères de départ xvz.la source
Vous devez spécifier le répertoire où
ls
va chercher dans un exemplecela fonctionne pour moi, mais évidemment, il ne prend pas en charge la recherche par modèle
la source
abc
et se terminer par.zip
.