Comment choisir des fichiers spécifiques dans un répertoire différent en utilisant bash?


13

Je veux lister (ou supprimer, ou faire une autre opération) sur certains fichiers dans un répertoire, comme ceci:

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

Comment puis-je y parvenir (sans cd-ing dans le répertoire en premier)?

Réponses:



3

Sous bash, exécutez shopt -s extglob(ou mettez-le dans votre ~/.bashrc) et vous pouvez utiliser des modèles supplémentaires qui fournissent des expressions régulières avec une syntaxe inhabituelle (héritée de ksh). Vous pouvez également utiliser ces modèles dans ksh, bien sûr, et aussi dans zsh après setopt ksh_glob.

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Dans zsh, vous pouvez directement l'utiliser (foo|bar)comme modèle.

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Notez que la commande est appelée avec le chemin complet. Si vous souhaitez appeler la commande avec un chemin court, vous devrez modifier le répertoire d'une manière ou d'une autre, et (cd /opt/somedir && somecommand aa bb cc)c'est de loin le moyen le plus simple.


Si vous regardez attentivement, vous verrez que je spécifie "sans cd-ing dans le répertoire en premier" dans ma question;)
neu242

1

Vous pouvez filtrer en utilisant egrep:

ls | egrep '(aa|bb|cc)'

Pour rechercher tous les fichiers texte:

ls | egrep '(aa|bb|cc).txt'

1
dot correspondra à chaque caractère, et cette approche rend difficile de continuer à opérer sur ces fichiers
enzotib

1
J'ai l'impression que ls n'était qu'un exemple de commande également.
Random832

Oui, vous avez raison, j'ai spécifié que je voulais faire une opération: lister les fichiers n'était qu'un exemple.
neu242

Bons commentaires chers amis, merci. Bonne chance neu242: D
Ocean

1

Tout d'abord, je vous ordonne de: ne jamais analyser ls , jamais . La manière appropriée et canonique de faire ce que vous voulez est de trouver .

Par exemple:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

J'utilise habituellement -nameau lieu de -regexcar c'est plus simple. Mais une expression régulière convient à votre cas d'utilisation. Vous devez exécuter la commande sans -exec la première fois, pour vous assurer qu'il s'agit bien des fichiers que vous souhaitez déplacer / supprimer.


Je n'ai jamais dit que j'analyserais ls, et Rush avait une bien meilleure réponse. Merci d'avoir essayé, cependant :)
neu242
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.