Odpowiedzi:
Robi to, czego szukasz:
find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
To używa find
raczej niż ls
dlatego, że generalnie parsowanie ls
danych wyjściowych jest zawodne . find
Jednak 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 print0
nakazuje find
wydrukowanie 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 find
i zastosowanie do nich polecenia.
-L1
Opcja mówi xargs
do pracy na jednym tylko nazwy pliku naraz. Ta -p
opcja nakazuje xargs
monit o zatwierdzenie przed kontynuowaniem. Ta -0
opcja mówi xargs
o użyciu znaku null jako separatora między nazwami plików.
[Nie wiedziałem o -p
możliwości, xargs
dopó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 1
przed -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 -p
tak bardzo, że go skopiuję.
touch "a very long file name
i 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.
find
polecenie POSIX kompatybilnym, używając-exec printf '%s\0' {} +
. Nie sądzę jednak, aby istniał sposób na kompatybilność z POSIX.