liste des fichiers avec motif avec début et fin

9

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

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

Réponses:

15

lsne 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 printfpour l'impression:

printf '%s\n' abc*.zip

Vous pouvez également le transmettre à ls -lpour afficher les attributs de ces fichiers:

ls -ld abc*.zip

(nous en avons besoin -dcar si l'un de ces fichiers est de type répertoire , lsil listerait leur contenu autrement).

Ou pour unziples extraire si seulement ils unzippouvaient extraire plus d'un fichier à la fois. Malheureusement, ce n'est pas le cas, vous devez donc utiliser xargs -n1soit une forboucle:

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, unziplui-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*.zipmodèle, vous voudrez donc réellement:

 unzip 'abc*.zip'

( En fait , notre xargset forapproche ci - dessus serait une erreur, parce que s'il y a un fichier appelé abc*.zippar exemple, unziptraiterait comme un modèle! Voir bsdtarune façon plus unixy pour extraire les ziparchives)


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 abcpiè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 bashci-dessus.

Stéphane Chazelas
la source
9
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 findimplémentations, vous pouvez également utiliser -inameau lieu de -namepour la recherche insensible à la casse ( aBc<date>.ZIPcorrespondrait é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 -ipour la recherche insensible à la casse.

Jan Dusek
la source
1
Notez que cette limite n'est pas une limite de shell. C'est une limite de noyau dans l' execve()appel système.
Stéphane Chazelas
Il convient probablement de noter que findces fichiers seront également recherchés dans les sous-répertoires. Utilisez find . ! -name . -prune -name 'abc*.zip' -printou find . -maxdepth 1 -name 'abc*.zip'si vos findsupports -maxdepthcomme sur GNU ou BSD ou find . -depth 1 -name 'abc*.zip'si vos findsupports -depth <n>comme sur certains BSD pour restreindre au répertoire courant.
Stéphane Chazelas
$ ls ../*.atravaillé pour moi (liste des archives dans le répertoire parent).
Daniel
0

Essayez d'utiliser ls abc*.zippour 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.

Jeff
la source
-1

Vous devez spécifier le répertoire où lsva 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

Kevin Montalvo
la source
1
Cela ne règle pas la question; les fichiers doivent commencer par abcet se terminer par .zip.
Jeff Schaller