Come faccio ad aprire tutti i file che sono il risultato di un comando ls?


10

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:


12

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 lsaffatto! 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 fileti 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 xargso fornella risposta di jmtd a seconda che tu stia utilizzando un editor basato su terminale che necessita di stdio.



@Gilles: debitamente notato, grazie per aver sottolineato l'ovvio che non tutti potevamo vedere. @ c0smikdebris Nota che ho appena riscritto completamente la mia risposta, incluso un caso, se non hai un modo ovvio di abbinare quali file sono di testo solo con il loro nome.
Caleb,

$ () è quello che stavo effettivamente cercando. avrei dovuto menzionare che sto usando ls come esempio qui. +1 per entrambe le risposte.
c0smikdebris,

"il mio editore preferito". Non c'è bisogno di specificare, @Caleb, poiché è chiaro più o meno dall'inizio della risposta, ahahah! Il miglior editore di sempre!
Enrico Maria De Angelis,

4

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 *.txto qualsiasi altra cosa. Utilizzare solo *per abbinare tutti i file nella directory corrente.

Si noti che il lscomando non è coinvolto. Il compito di lsnon è 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.


Questo è davvero specifico dell'editor. Non vi è alcuna garanzia che tutti gli editor tratteranno tutti i loro argomenti della riga di comando gratuiti come file da aprire, né supportano l'apertura di più di un file alla volta.
jmtd,

2

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 findin 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

2
Non analizzare l'output di ls! Usa $EDITOR *.co for i in *.c; do $EDITOR "$i"; done.
Gilles 'SO- smetti di essere malvagio'

Buona cattura - modificata in modo appropriato.
jmtd,

Si noti che il forcaso non riuscirà per molti nomi di file, incluso comprimere / modificare i caratteri degli spazi bianchi.
jmtd,

Come è scritto ora, il forcaso funzionerà con tutti i nomi di file (tranne eventualmente i nomi che iniziano con -o +con alcuni editor; for i in ./*.clo risolverebbe).
Gilles 'SO- smetti di essere malvagio'
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.