Odpowiedzi:
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ł.]
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.
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”.
xargs -ptak bardzo, że go skopiuję.
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.
findpolecenie POSIX kompatybilnym, używając-exec printf '%s\0' {} +. Nie sądzę jednak, aby istniał sposób na kompatybilność z POSIX.