Esiste un comando a una riga per rendere interattivo chmod?


24

Sto cercando qualcosa come:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

O sintassi simile.

Inoltre potrebbe funzionare su altri comandi per i quali desideri la conferma individuale.

Risposte:


45

Questo fa quello che stai cercando:

find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x

Questo utilizza findpiuttosto che lsperché, in genere, l' analisi lsdell'output non è affidabile . Questo modulo, findtuttavia, funzionerà con nomi di file anche se contengono nuove righe o altri caratteri difficili.

Spiegazione

  • find . -maxdepth 1 -type f -print0

    Questo seleziona i file. Questo può essere personalizzato usando una delle tante opzioni di find. L'opzione print0dice finddi stampare i nomi dei file in un elenco separato da null. Questo è l'unico affidabile per trasmettere elenchi di nomi di file.

  • xargs -L1 -p0 chmod +x

    Questo prende l'elenco separato da null di nomi di file generati da finde applica loro il tuo comando.

L' -L1opzione dice xargsdi lavorare su un solo nome di file alla volta. L' -popzione indica xargsdi richiedere l'approvazione prima di continuare. L' -0opzione dice xargsdi usare il carattere null come delimitatore tra i nomi dei file.

[Non ero a conoscenza -pdell'opzione xargsfino a quando @kwan non l'ha sottolineato.]


È possibile rendere findcompatibile il comando POSIX utilizzando -exec printf '%s\0' {} +. Tuttavia, non pensare che ci sia modo di rendere compatibile POSIX.
20

Questa sintassi mi dà un avvertimento find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.Così funziona con la -maxdepth 1prima della -type f, come: find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Harvey,

@Harvey Hai ragione: ho aggiornato la risposta per rimuovere quell'avvertimento.
Giovanni 1024,

25

È possibile utilizzare xargs.

per esempio:

ls|xargs -I path -p chmod +x path

Opzione -p: chiedere all'utente se eseguire ciascuna riga di comando e leggere una riga dal terminale. Esegui la riga di comando solo se la risposta inizia con 'y' o 'Y'.


1
+1 Mi piace il tuo uso di xargs -pcosì tanto che lo copierò.
Giovanni 1024

1
Perfezionare! E un modo molto semplice per rendere interattivi quasi tutti i comandi. Grazie.
Harvey,


@Kroltan - perché qualcuno dovrebbe usare una nuova riga in un nome file?
nbubis,

1
@nbubis Può succedere: vai su un terminale e digita touch "a very long file namee premi Invio. Vedi la continuazione della riga e digita semplicemente il preventivo di chiusura e premi di nuovo Invio. tadaa, newline nel nome file. Per pigrizia per riscrivere un lungo nome di file.
Kroltan,
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.