Apakah ada perintah satu baris untuk membuat chmod interaktif?

24

Saya mencari sesuatu seperti:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Atau sintaksis yang serupa.

Juga dapat bekerja pada perintah lain yang Anda inginkan untuk konfirmasi individual.

Harvey
sumber

Jawaban:

45

Ini melakukan apa yang Anda cari:

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

Ini menggunakan finddaripada lskarena, umumnya, parsing lsoutput tidak dapat diandalkan . Namun, formulir ini findakan berfungsi dengan nama file walaupun mengandung baris baru atau karakter sulit lainnya.

Penjelasan

  • find . -maxdepth 1 -type f -print0

    Ini memilih file. Ini dapat dikustomisasi menggunakan banyak opsi find. Opsi print0memberi tahu finduntuk mencetak nama file dalam daftar yang dipisahkan nol. Ini adalah satu-satunya yang dapat diandalkan untuk mengirimkan daftar nama file.

  • xargs -L1 -p0 chmod +x

    Ini mengambil daftar nama file yang dipisahkan nol yang dihasilkan oleh finddan menerapkan perintah Anda kepada mereka.

The -L1pilihan memberitahu xargsbekerja hanya pada satu nama file pada satu waktu. The -ppilihan memberitahu xargsprompt untuk persetujuan sebelum melanjutkan. The -0pilihan memberitahu xargsuntuk menggunakan karakter null sebagai pembatas antara nama file.

[Aku tidak tahu -ppilihan untuk xargssampai @ kwan menunjukkannya.]

John1024
sumber
Anda dapat membuat findperintah POSIX kompatibel dengan menggunakan -exec printf '%s\0' {} +. Jangan berpikir ada cara untuk membuat semuanya POSIX kompatibel.
l0b0
Sintaks ini memberi saya peringatan 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.Jadi bekerja dengan -maxdepth 1sebelum -type f, sebagai: find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Harvey
@ Harvey Anda benar: Saya memperbarui jawaban untuk menghapus peringatan itu.
John1024
25

Anda bisa menggunakannya xargs.

misalnya:

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

Opsi -p: Beri tahu pengguna apakah akan menjalankan setiap baris perintah dan membaca baris dari terminal. Jalankan saja baris perintah jika responsnya dimulai dengan 'y' atau 'Y'.

Kwan
sumber
1
+1 Saya sangat menyukai penggunaan Anda xargs -psehingga saya akan menyalinnya.
John1024
1
Sempurna! Dan cara yang sangat sederhana untuk membuat sebagian besar perintah menjadi interaktif. Terima kasih.
Harvey
21
Jangan diurai ls.
Kroltan
@Kroltan - mengapa ada orang yang menggunakan baris baru dalam nama file?
nbubis
1
@nbubis Itu bisa terjadi: pergi ke terminal dan ketik touch "a very long file namedan tekan enter. Lihat kelanjutan garis dan cukup ketik kutipan penutup dan tekan enter lagi. tadaa, baris baru dalam nama file. Karena malas untuk mengetik ulang nama file yang panjang.
Kroltan