Hanya folder chmod rekursif atau hanya file melalui skrip atau menu nautilus?

8

Ini telah dibahas sebelumnya di sini .

Yang ingin saya ketahui adalah cara mengubahnya:

Hanya file chmod rekursif dalam folder ini:

find . -type f -exec chmod 0600 {} \;

Folder hanya chmod rekursif dalam folder ini:

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

menjadi skrip bash, jadi bisa berupa sesuatu seperti:

Untuk file:

rchmodf 744 .

Untuk direktori:

rchmodd 755 .

dan ... juga mungkin menjadi opsi menu klik kanan nautilus jika memungkinkan.

DM8
sumber

Jawaban:

10

Berikut skrip yang dapat Anda panggil dengan melewati mode sebagai argumen pertama dan satu atau lebih nama direktori sebagai argumen selanjutnya. Di Linux, jika Anda tidak memasukkan nama direktori apa pun, itu akan seolah-olah Anda lulus .(direktori saat ini). Beri nama skrip ini rchmodf, buat agar dapat dieksekusi ( chmod a+rx /path/to/rchmodf) dan letakkan di suatu tempat di $PATH.

#!/bin/sh
mode=$1; shift
find "$@" -type f -exec chmod "$mode" {} +

Penjelasan: mode=$1; shiftmengatur variabel modeke argumen pertama skrip dan menghapus argumen pertama dari daftar. "$@"memperluas ke daftar semua argumen.

Jika suka, Anda bisa membuat skrip yang menerima mode direktori dan mode file.

#!/bin/sh
dir_mode=$1; shift
file_mode=$1; shift
find "$@" -type d -exec chmod "$dir_mode" {} + -o -type f -exec chmod "$file_mode" {} +

Perhatikan bahwa 744 bukan mode file yang berguna; 644 (dapat ditulis pengguna dan dapat dibaca dunia) dan 755 (juga dapat dieksekusi dunia) jauh lebih umum. Juga, mengubah setiap file di pohon menjadi executable atau tidak menjadi executable jarang berguna; Anda mungkin ingin memanggil skrip ini dengan argumen seperti +rX(modal X, untuk mengatur bit yang dapat dieksekusi hanya untuk direktori dan untuk file yang sudah dapat dieksekusi). Bahkan, Xmodus simbolis mungkin apa yang Anda setelah dengan script ini: chmod -R +rX ..

Dengan bash atau zsh, ada cara lain untuk bertindak secara rekursif tetapi hanya pada direktori. Untuk bash, Anda memerlukan versi 4 dan untuk menjalankannya shopt -s globstarterlebih dahulu.

chmod a+rx **/*/

Dalam zsh, Anda dapat bertindak pada file hanya dengan suffixing (.): chmod a+r **/*(.).

Saya akan menyampaikan pertanyaan Nautilus.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ninja dan nincompoops! Anda dapat menggunakan satu temuan untuk menjalankan perintah yang berbeda pada set hasil yang berbeda? +1 untuk overloading operator OR.
Caleb
1

Skrip ditautkan oleh user23538, harap Anda tidak keberatan.

Saya sudah mencobanya dan berfungsi dengan baik. Harap perhatikan bahwa jika Anda menggunakan. sebagai argumen path (jalankan di direktori yang sama di mana skrip berada), itu sebenarnya mengubah skrip hak akses file skrip sendiri ke 644, jadi letakkan di direktori di atas.

#!/bin/sh
#
# chmodr.sh
#
# author: Francis Byrne
# date: 2011/02/12
#
# Generic Script for recursively setting permissions for directories and files
# to defined or default permissions using chmod.
#
# Takes a path to recurse through and options for specifying directory and/or
# file permissions.
# Outputs a list of affected directories and files.
#
# If no options are specified, it recursively resets all directory and file
# permissions to the default for most OSs (dirs: 755, files: 644).

# Usage message
usage()
{
echo "Usage: $0 PATH -d DIRPERMS -f FILEPERMS"
echo "Arguments:"
echo "PATH: path to the root directory you wish to modify permissions for"
echo "Options:"
echo " -d DIRPERMS, directory permissions"
echo " -f FILEPERMS, file permissions"
exit 1
}

# Check if user entered arguments
if [ $# -lt 1 ] ; then
usage
fi

# Get options
while getopts d:f: opt
do
case "$opt" in
d) DIRPERMS="$OPTARG";;
f) FILEPERMS="$OPTARG";;
\?) usage;;
esac
done

# Shift option index so that $1 now refers to the first argument
shift $(($OPTIND - 1))

# Default directory and file permissions, if not set on command line
if [ -z "$DIRPERMS" ] && [ -z "$FILEPERMS" ] ; then
DIRPERMS=755
FILEPERMS=644
fi

# Set the root path to be the argument entered by the user
ROOT=$1

# Check if the root path is a valid directory
if [ ! -d $ROOT ] ; then
echo "$ROOT does not exist or isn't a directory!" ; exit 1
fi

# Recursively set directory/file permissions based on the permission variables
if [ -n "$DIRPERMS" ] ; then
find $ROOT -type d -print0 | xargs -0 chmod -v $DIRPERMS
fi

if [ -n "$FILEPERMS" ] ; then
find $ROOT -type f -print0 | xargs -0 chmod -v $FILEPERMS
fi
Kluny
sumber
@ user23538 sudah diinstruksikan untuk menempelkan kode di blok di tempat. Anda tidak harus memposting persis seperti itu kecuali Anda memiliki sesuatu untuk ditambahkan.
HalosGhost
Mereka diperintahkan, tetapi tidak. Jadi saya lakukan. Itulah yang diminta, bahkan jika saya bukan orang yang sama. Tolong jelaskan mengapa ini tidak benar?
Kluny
Ahh, saya tidak tahu berapa lama yang lalu pengguna memposting jawaban mereka. Jika Anda menemukan sesuatu tentang jawaban Anda untuk diedit, saya akan dengan senang hati menghapus suara saya.
HalosGhost
0

Saya menulis sebuah skrip yang pada dasarnya melakukan hal di atas tetapi juga memberikan sedikit fleksibilitas untuk opsi baris perintah (direktori dan / atau izin file, atau mengecualikan keduanya secara otomatis me-reset semuanya ke 755-644). Itu juga memeriksa beberapa skenario kesalahan.

http://bigfloppydonkeydisk.blogspot.com.au/2012/09/recursively-chmod-only-files-or.html

pengguna23538
sumber
2
Anda harus menempelkan kode di sini. Dengan begitu, kami menghindari banyak tautan mati di masa mendatang. Jika Anda khawatir tentang dua versi yang terpisah, Anda masih dapat meninggalkan tautan di sana untuk referensi.
l0b0