Czy istnieje jedno wierszowe polecenie, aby chmod był interaktywny?

24

Szukam czegoś takiego:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Lub podobna składnia.

Może również działać na innych poleceniach, dla których chcesz uzyskać indywidualne potwierdzenie.

Harvey
źródło

Odpowiedzi:

45

Robi to, czego szukasz:

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

To używa findraczej niż lsdlatego, że generalnie parsowanie lsdanych wyjściowych jest zawodne . findJednak ten formularz będzie działał z nazwami plików, nawet jeśli zawierają one nowe wiersze lub inne trudne znaki.

Wyjaśnienie

  • find . -maxdepth 1 -type f -print0

    To wybiera pliki. Można to dostosować za pomocą dowolnej z wielu opcji find. Ta opcja print0nakazuje findwydrukowanie nazw plików na liście rozdzielonej znakiem null. Jest to jedyny niezawodny sposób przesyłania list nazw plików.

  • xargs -L1 -p0 chmod +x

    Spowoduje to pobranie rozdzielonej wartościami zerowymi listy nazw plików wygenerowanych przez findi zastosowanie do nich polecenia.

-L1Opcja mówi xargsdo pracy na jednym tylko nazwy pliku naraz. Ta -popcja nakazuje xargsmonit o zatwierdzenie przed kontynuowaniem. Ta -0opcja mówi xargso użyciu znaku null jako separatora między nazwami plików.

[Nie wiedziałem o -pmożliwości, xargsdopóki @kwan tego nie wskazał.]

John1024
źródło
Możesz uczynić findpolecenie POSIX kompatybilnym, używając -exec printf '%s\0' {} +. Nie sądzę jednak, aby istniał sposób na kompatybilność z POSIX.
l0b0
Składnia ta daje mi ostrzeżenie 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.Tak to działa z -maxdepth 1przed -type f, jak: find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x.
Harvey,
@Harvey Masz rację: zaktualizowałem odpowiedź, aby usunąć to ostrzeżenie.
John1024
25

Możesz użyć xargs.

na przykład:

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

Opcja -p: Zapytaj użytkownika, czy uruchomić każdy wiersz poleceń i odczytać wiersz z terminala. Uruchom wiersz polecenia tylko wtedy, gdy odpowiedź zaczyna się od „y” lub „Y”.

Kwan
źródło
1
+1 Podoba mi się twoje wykorzystanie xargs -ptak bardzo, że go skopiuję.
John1024
1
Doskonały! I bardzo prosty sposób na interaktywność większości poleceń. Dzięki.
Harvey
21
Nie parsuj ls.
Kroltan
@Kroltan - dlaczego ktokolwiek miałby używać nowego wiersza w nazwie pliku?
nbubis
1
@nbubis Może się zdarzyć: przejdź do terminala, wpisz touch "a very long file namei naciśnij enter. Zobacz kontynuację linii i po prostu wpisz cytat zamykający i ponownie naciśnij enter. tadaa, nowa linia w nazwie pliku. Z lenistwa, aby przepisać długą nazwę pliku.
Kroltan