Come faccio a scegliere file specifici in una directory diversa usando bash?


13

Voglio elencare (o eliminare, o fare qualche altra operazione) su alcuni file in una directory, come questa:

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

Come posso raggiungere questo obiettivo (senza prima effettuare il CD nella directory)?

Risposte:



3

Sotto bash, esegui shopt -s extglob(o inseriscilo nel tuo ~/.bashrc) e puoi usare schemi aggiuntivi che forniscono espressioni regolari con una sintassi insolita (ereditata da ksh). Puoi usare questi schemi anche in ksh, ovviamente, e anche in zsh dopo setopt ksh_glob.

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

In zsh, puoi usare direttamente (foo|bar)come modello.

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

Si noti che il comando viene chiamato con il percorso completo. Se si desidera chiamare il comando con un breve percorso, è necessario modificare la directory in qualche modo ed (cd /opt/somedir && somecommand aa bb cc)è di gran lunga il modo più semplice.


Se guardi da vicino, vedrai che ho specificato "senza prima
inserire

1

Puoi filtrare usando egrep:

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

Per trovare tutti i file di testo:

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

1
punto corrisponderà a tutti i caratteri e questo approccio rende difficile operare ulteriormente su questi file
enzotib

1
Ho avuto la sensazione che anche ls fosse solo un comando di esempio.
Casuale 832,

Sì, hai ragione, ho specificato che voglio fare un'operazione: elencare i file era solo un esempio.
neu242,

Buoni commenti cari amici, grazie. Buona fortuna neu242: D
Ocean

1

In primo luogo, ti indirizzo a: non analizzare mai , mai . Il modo corretto e canonico di fare ciò che vuoi è trovare .

Per esempio:

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

Di solito lo uso -nameinvece di -regexcome è più semplice. Ma una regex si adatta al tuo caso d'uso. È necessario eseguire il comando senza -exec la prima volta, per assicurarsi che siano effettivamente i file che si desidera spostare / eliminare.


Non ho mai detto che avrei analizzato, e Rush aveva una risposta molto migliore. Grazie per aver provato, però :)
neu242
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.