2012-07-13

Linux 簡單檔案批次設定權限

Linux 是一種對於檔案管理非常嚴格的系統,雖然嚴格,但設定上卻很簡單
透過 +/- r, w, x 或 八進制數值 控制權限
普遍地,利用
chmod -R 0777 /var/www
便可以將整個 /var/www 改變成 0777 權限

雖然這個指令可以將整個目錄及檔案的設定為 0777
但是一般檔案,如在例子中的 /var/www 大部分都可文字檔案,並不希望檔案具備執行權限
因此這種方法在這種狀態並不適合
在下編寫了 shell script 可分別將目錄及檔案的權限分開設定
#!/bin/sh
 
run(){
    path="${1}"
    dir="${2}"
    file="${3}"
    cdir="${4}"
    cfile="${5}"
 
    for f in "${path}/"*; do
        if [ -d "${f}" ]; then
            cdir=$((cdir+1))
            echo "chmod '${dir}' '${f}'"
            chmod "${dir}" "${f}"
            run "${f}" "${dir}" "${file}" "${cdir}" "${cfile}"
        elif [ -f "${f}" ]; then
            cfile=$((cfile+1))
            echo "chmod '${file}' '${f}'"
            chmod "${file}" "${f}"
        fi
    done
}
 
cdir='0'
cfile='0'
 
if [ "${#}" -eq '1' ]; then
    dir='0755'
    file='0644'
elif [ "${#}" -eq '3' ]; then
    dir="${2}"
    file="${3}"
else
    echo "${0} <path> [dir_mode=0755 file_mode=0644]"
    exit
fi
 
run "${1}" "${dir}" "${file}" "${cdir}" "${cfile}"
 
if [ "${cdir}" -eq '0' ]; then
    echo 'No directories are changed'
elif [ "${cdir}" -eq '1' ]; then
    echo "${cdir} directory changes to ${dir}"
else
    echo "${cdir} directories change to ${dir}"
fi
 
if [ "${cfile}" -eq '0' ]; then
    echo 'No files are changed'
elif [ "${cfile}" -eq '1' ]; then
    echo "${cfile} file changes to ${file}"
else
    echo "${cfile} files change to ${file}"
fi
#
可能是 plugin 問題
script 中最後的 # 是不需要的
使用方法相當簡單
script 只需要任意名稱、如 a.out
利用
./a.out <path> [dir_mode=0755 file_mode_=0644]
path 必須項目,為管理目錄或檔案
dir_mode 可選,為目錄權限;若不設定,為 0755
file_mode 可選,為檔案權限;若不設定,為 0644
例如
./a.out /var/www 0755 0644
另外,可以設定 PATH 來引入執行指令,不需要每次使用絕對或相對路徑來執行 script

當然,若果閣下的 Linux 有安裝 X11,便可以直接透過 GUI 設定

沒有留言 :

張貼留言