Chmod'u etkileşimli yapmak için bir satır komutu var mı?


24

Gibi bir şey arıyorum:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Veya benzer bir sözdizimi.

Ayrıca, bireysel onay almak istediğiniz diğer komutlar üzerinde de çalışabilir.

Yanıtlar:


45

Bu aradığınızı yapar:

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

Bunun findyerine ls, genellikle ayrıştırma lsçıktısının güvenilmez olması nedeniyle kullanır . findAncak bu form, yeni satırlar veya başka zor karakterler içermesine rağmen dosya adları ile çalışacaktır.

açıklama

  • find . -maxdepth 1 -type f -print0

    Bu dosyaları seçer. Bu, bulgunun birçok seçeneğinden herhangi biri kullanılarak özelleştirilebilir. Seçenek , dosya adlarını boş bir listeye yazdırmayı print0bildirir find. Bu, dosya adlarının listesini ileten tek güvenilir olanıdır.

  • xargs -L1 -p0 chmod +x

    Bu, null ile ayrılmış dosya adlarının listesini alır ve findkomutunuzu bunlara uygular.

-L1Seçenek söyler xargsbir seferde sadece bir dosya adı üzerinde çalışmaya. -pSeçenek söyler xargsdevam etmeden önce onay için istemi için. -0Seçenek söyler xargsdosya adları arasındaki ayırıcı olarak null karakteri kullanmak.

[ Kwan işaret ettiğine kadar -pseçeneğinin farkında xargsdeğildim.]


findPOSIX komutunu kullanarak uyumlu hale getirebilirsiniz -exec printf '%s\0' {} +. Her şeyi POSIX ile uyumlu hale getirmenin bir yolu olduğunu düşünmeyin.
l0b0

Bu sözdizimi bana bir uyarı verir. 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.Bundan -maxdepth 1önce -type f, as ile çalışır find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Harvey

@Harvey Haklısın: Bu uyarıyı kaldırmak için cevabı güncelledim.
John1024,

25

Kullanabilirsiniz xargs.

Örneğin:

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

Seçenek -p: Kullanıcıdan her komut satırını çalıştırıp çalıştırmamasını isteyin ve terminalden bir satır okuyun. Komut satırını yalnızca yanıt 'y' veya 'Y' ile başlıyorsa çalıştırın.


1
+1 Kullanımınızı xargs -po kadar çok seviyorum ki kopyalayacağım.
John1024

1
Mükemmel! Ve herhangi bir komutu en etkileşimli hale getirmek için çok basit bir yol. Teşekkürler.
Harvey


@Kroltan - neden biri dosya adında yeni bir satır kullansın?
nbubis

1
@ nebubis Olabilir: bir terminale gidip touch "a very long file nameyazıp enter tuşuna basın. Satırın devamına bakın ve sadece kapanış teklifini yazın ve tekrar enter tuşuna basın. tadaa, dosya adındaki newline. Tembelliğin dışında uzun bir dosya adı yeniden yazın.
Kroltan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.