Odpowiedzi:
Możesz użyć find
do wyszukiwania wszystkich plików, które nie pasują do podanej nazwy pliku i exec
polecenia dla wszystkich takich plików znalezionych jako:
Zakładając, że musisz wykluczyć katalog test
i dać uprawnienia do plików 755 do wszystkich innych plików i katalogów. Zostanie to wykonane z góry drzewa.
find ! -name test -exec chmod 755 {} \;
mtk@mtk4-laptop:$ touch a1.txt a2.txt a3.txt test
mtk@mtk4-laptop:$ ls -lrt
total 0
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 test
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a3.txt
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a2.txt
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 a1.txt
mtk@mtk4-laptop:$ find ! -name test -exec chmod 777 {} \;
mtk@mtk4-laptop:$ ls -lrt
total 0
-rw-rw-r-- 1 mtk mtk 0 Sep 17 23:55 test
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a3.txt*
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a2.txt*
-rwxrwxrwx 1 mtk mtk 0 Sep 17 23:55 a1.txt*
mtk@mtk4-laptop:$
Uprawnienia do pliku test
pozostały niezmienione. To samo dotyczy katalogów.
mkdir test
+ touch a1.txt a2.txt a3.txt
, a następnie wykonaj polecenie.
Jaka skorupa?
Jeśli korzystasz z bash (prawdopodobnie na Linuksie), możesz sprawdzić extglob, który daje więcej opcji globowania, w tym „negatyw glob”!()
shopt -s extglob
chmod 774 !(file-to-ignore)
Używając find
prostszego w ten sposób:
find <from_where_to_change> -not -path "*/<excluded_dir_name>*" [-and -not -path "*/<another_excluded_dir_if_you_want>*"] -exec chown <user>[:<group>] {} \;
W moim przypadku było to:
find /data/project -not -path "*/.svn*" -exec chown :www-data {} \;
W ten sposób rekursywnie zmieniłem grupę w folderze / danych / projekcie, z wyjątkiem rekursywnie wszystkich folderów „.svn”.
Korzystam z poniższego polecenia, da pliki 644 i katalog 755 wszystkim plikom i katalogom w obecnym katalogu roboczym, ale wykluczy katalog var, aby zapewnić uprawnienia.
find . -not -path "*/var*" -type f -exec chmod -c 0644 {} \; && find . -not -path "*/var*" -type d -exec chmod -c 0775 {} \;
grep -v "directory to exclude"