Czy możesz zmienić uprawnienia do wszystkich plików oprócz jednego katalogu w systemie Linux?

7

Czy istnieje sposób zmiany uprawnień do wszystkich plików / katalogów oprócz jednego katalogu w jednym poleceniu wiersza poleceń systemu Linux?

Rana
źródło
grep -v "directory to exclude"

Odpowiedzi:

5

Zakładając, że chcesz ustawić rekursywnie bit uprawnień 755 dla zawartości folderów w bieżącym katalogu roboczym, oprócz zawartości folderu o nazwie „nameOfFolderToBeExcluded” :

 chmod 755 -R $(ls | awk '{if($1 != "nameOfFolderToBeExcluded"){ print $1 }}')
p_strand
źródło
4

Możesz użyć finddo wyszukiwania wszystkich plików, które nie pasują do podanej nazwy pliku i execpolecenia dla wszystkich takich plików znalezionych jako:

Zakładając, że musisz wykluczyć katalog testi 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 {} \;

Przetestowany

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 testpozostały niezmienione. To samo dotyczy katalogów.

Mt.
źródło
Wyklucza to tylko pliki o tej nazwie - nie foldery. Spróbuj mkdir test+ touch a1.txt a2.txt a3.txt, a następnie wykonaj polecenie.
Kraang Prime
2

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)
Rich Homolka
źródło
1

Używając findprostszego 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”.

Zanshee
źródło
0

Jeszcze łatwiejszy sposób za pomocą podstawowych poleceń:

chmod 755 -R $(ls -A|grep -v 'directory_name_to_exclude/*')
Wsiewołod
źródło
0

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 {} \;
Akash Sharma
źródło