Vorrei aprire tutti i file di testo che sono il risultato di un comando ls usando un editor di testo. Come faccio a fare questo?
Vorrei aprire tutti i file di testo che sono il risultato di un comando ls usando un editor di testo. Come faccio a fare questo?
Risposte:
Gilles ha esattamente ragione , ls
è davvero un cattivo esempio perché l'espansione glob del nome del file può essere fatta molto più facilmente dalla riga di comando senza dover usare ls
affatto! Se i tuoi cosiddetti "file di testo" hanno estensioni di file per identificarli, potresti fare qualcosa del genere:
editor-command *.txt
Per motivi di dimostrazione di una tecnica, usiamo un esempio più complicato che non potrebbe essere fatto solo con una corrispondenza di nome file e aprire i file in base al contenuto anziché al solo nome del file. Diciamo che volevi aprire tutti i file che contenevano la stringa "content-type".
Supponendo che il tuo editor accetti più nomi di file e li apra tutti in una volta in buffer separati o funzioni in sequenza attraverso di essi, puoi semplicemente eseguire:
editor-command $(grep -i content-type)
Ora torniamo alla tua domanda originale, diciamo che non sai se sono file di testo o non si basano sui loro nomi. Dovresti quindi utilizzare un altro programma per identificarli, quindi aprirli in base a tali dati. Il programma file
ti dirà che tipo di file è qualcosa e puoi grep quell'elenco solo per i file di testo, quindi aprire solo i nomi dei file corrispondenti in questo modo:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
L'output della catena di comandi all'interno del $()
costrutto verrà utilizzato come argomento per l'editor. A volte lo faccio in due fasi. Supponiamo che io stia esaminando una serie di file e mi procuro un elenco di ogni file XML contenente la stringa "content-type"
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... e decido che voglio aprirli. Quindi uso l'ultimo collegamento della cronologia dei comandi e faccio questo:
vim $(!!)
... per aprire tutti i risultati del comando precedente in vim, il mio editor preferito.
Se il tuo editor accetterà solo un file alla volta e dovrai continuare a creare gli editor, dovrai utilizzare una variante del ciclo xargs
o for
nella risposta di jmtd a seconda che tu stia utilizzando un editor basato su terminale che necessita di stdio.
Per aprire tutti i file chiamati qualcosa .txt
(cioè *.txt
) nella directory corrente:
$EDITOR *.txt
dove $EDITOR
è il vostro editor preferito, per esempio gedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
o qualsiasi altra cosa. Utilizzare solo *
per abbinare tutti i file nella directory corrente.
Si noti che il ls
comando non è coinvolto. Il compito di ls
non è davvero quello di visualizzare un elenco di file, anche se ciò accade quando lo si invoca in una directory. Dove ls
è utile è visualizzare gli attributi del file (tempo di modifica, permessi, dimensioni e così via). Per fare qualcosa su un mucchio di file che corrispondono a un certo modello di caratteri jolly, sono sufficienti i globs della shell .
Gli editor abbastanza avanzati ti consentono di farlo dall'interno. Ad esempio, in Emacs, basta usare il normale comando di apertura dei file ( C-x C-f
) e inserire *.txt
.
Se si desidera abbinare anche i file nelle sottodirectory, in zsh o bash ≥4, è possibile utilizzare $EDITOR **/*.txt
.
Dipende da alcune sfumature del tuo editor di testo. Gli editor avanzati possono probabilmente gestire l'apertura di più file dalla riga di comando in un'istanza. Ad esempio, supponiamo che il tuo editor ($ EDITOR nei miei esempi seguenti) possa aprirne solo uno alla volta. È necessario reindirizzare l'output di un appropriato find
in xargs
. Questo dipende anche dal fatto che $ EDITOR non subentri al TTY (quindi, usando uno grafico)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
Se si desidera utilizzare un editor di console, un loop di shell potrebbe essere più appropriato, ma se fallirà per molti nomi di file non comuni (comprimendo o sostituendo i caratteri degli spazi bianchi e varie altre cose):
for i in *.c; do $EDITOR "$i"; done
for
caso non riuscirà per molti nomi di file, incluso comprimere / modificare i caratteri degli spazi bianchi.
for
caso funzionerà con tutti i nomi di file (tranne eventualmente i nomi che iniziano con -
o +
con alcuni editor; for i in ./*.c
lo risolverebbe).
editor-command *.css
, ecc.