CHMOD - Menerapkan Izin Berbeda Untuk File vs. Direktori

9

Saya telah mencoba untuk membersihkan izin pada beberapa kotak dan telah menjelajahi chmod man dan juga semua dokumentasi internet yang saya tangani tanpa hasil - jadi di sini kita mulai.

Pada dasarnya, saya punya direktori dengan banyak sub direktori dan file - dan saya ingin mengatur izin berikut:

Untuk direktori: 770 (u + rwx, g + rwx, o-rwx)

Untuk file: 660 (U + rw, g + rw, kapak, o-rw)

Saya ingin mencoba dan melakukan ini dengan chmod rekursif tunggal jika memungkinkan - untuk menghindari pengulangan melalui setiap direktori dan mengatur izin file-by-file.

Saya membayangkan harus ada cara untuk melakukan ini tanpa menulis skrip shell saya sendiri - tetapi saya belum dapat menemukan apa pun.

Saya menghargai bantuan Anda!

Skone
sumber

Jawaban:

10

Saya memang menemukan skrip yang berguna karena seringkali berguna untuk mengubah izin file dan direktori sekaligus, dan mereka sering ditautkan. 770 dan 660 untuk direktori bersama pada server file, 755/644 untuk direktori server web, dll. Saya menyimpan skrip w / mode yang paling umum digunakan untuk jenis server itu di bin root / dan lakukan pencarian secara manual ketika umum mode tidak berlaku.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac
iPaulo
sumber
Wow! Inilah yang saya cari. Terima kasih banyak!
Skone
Hai iPaulo - bisakah Anda menjelaskan "$ ii" di telepon "temukan $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;". Saya tidak yakin saya mengerti mengapa ini bukan hanya "menemukan $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" Terima kasih!
Skone
20

Tidak perlu skrip.

// Direktori:

find . -type d -exec chmod XXX {} \;

// File:

find . -type f -exec chmod XXX {} \;
Cerah
sumber
17

Dalam kasus Anda itu mungkin tidak harus serumit yang dilakukan orang lain (meskipun findmemang alat yang bagus untuk hal semacam ini secara umum). Perbedaan antara mode adalah bit eksekusi. Jika tidak ada file yang telah memiliki bit eksekusi, maka Anda dapat melakukannya dalam satu permintaan chmod, seperti yang Anda minta.

chmod -R u=rwX,g=rwX,o= FILE...

Kuncinya di sini adalah modal X, yang dijelaskan sebagai halaman manual

mengeksekusi / mencari hanya jika file tersebut adalah direktori atau sudah memiliki izin eksekusi untuk beberapa pengguna.

Jadi, jika file Anda belum memiliki bit eksekusi, itu hanya akan ditetapkan untuk direktori.

Mikael Auno
sumber
Ini hebat, tetapi lebih lama dari sekadar menulis 777. Apakah ada singkatan untuk -X?
Elliott B
6

Saya menemukan bahwa setidaknya untuk kasus penggunaan saya, menggunakan rsyncuntuk menyalin direktori ke dirinya sendiri jauh lebih cepat daripada menggunakan chmodlangsung dengan daftar file dari find.

rsync -rpt --chmod=D770,F660 . .

Jika Anda ingin menambahkan a chownke operasi yang sama, rsyncmemungkinkan Anda melakukannya juga dengan --chown=user:groupopsi.

Matthew Bush
sumber
Whoah, ini sebenarnya jauh lebih cepat daripada chmod -R.
Epeli
Jauh lebih cepat dari chmod. Apakah ada kelemahan menggunakan rsync dengan cara ini? Saya sudah sering melakukannya dan semuanya tampak baik-baik saja.
slothbear
1

Bersih dan sederhana:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
takeshin
sumber
Pendekatan yang sangat elegan.
user5336
3
mungkin, tetapi perhatikan bahwa ini hanya berfungsi jika file tidak memiliki spasi di dalamnya. Pendekatan yang lebih "aman" adalahfind ... -exec chmod ... {} \;
isaaclw