Permissions
如何在一個命令中創建多個嵌套目錄並定義所有目錄的權限?
在 Linux 中,以下兩個命令按預期工作:
mkdir -m 555 new_directory mkdir -p a/b/c
但是以下內容無法按預期工作:
mkdir -m 555 -p a/b/c
創建了 3 個目錄,但只有最新的目錄獲得了
555
權限。和a
目錄b
具有預設權限。那麼如何實現標題中描述的目標呢?可能嗎?
順便說一句 - 我選擇
555
了一個隨機案例,它也666
失敗777
了
如果您明確列出目錄,首先是父目錄,您可以實現在一個命令中創建目錄的既定目標:
mkdir -m 555 -p a a/b a/b/c
使用支持 csh 樣式大括號擴展的 shell,例如
bash
您可以以犧牲可讀性為代價稍微簡化一下:mkdir -m 555 -p a{,/b{,/c}}
但是請注意,如果它確實需要創建任何父目錄,則這兩個命令對於權限
555
都將失敗:此類目錄是使用不允許寫入的權限創建的,因此無法創建下一級目錄。最後,一個
bash
shell 腳本還可以為您提供在一個命令中創建多個目錄的功能,方法是將復雜性包裝在一個函式中。這將嘗試從下到上將權限應用於新創建的目錄,因此最終可能會得到沒有寫權限的目錄:mkdirs() { local dirs=() modes=() dir old # Grab arguments [[ "$1" == '-m' ]] && modes=('-m' "$2") && shift 2 dir=$1 # Identify missing directories while [[ "$dir" != "$old" ]] do [[ ! -d "$dir" ]] && dirs+=("$dir") old="$dir" dir="${dir%/*}" done # Create necessary directories and maybe fix up permissions for dir in "${dirs[@]}" do mkdir -p "${modes[@]}" "$dir" || return 1 [[ -n "${modes[1]}" ]] && chmod "${modes[1]}" "$dir" done }
例子
mkdirs -m 555 a/b/c ls -ld a a/b a/b/c dr-xr-xr-x+ 1 roaima roaima 0 Jan 7 10:01 a dr-xr-xr-x+ 1 roaima roaima 0 Jan 7 10:01 a/b dr-xr-xr-x+ 1 roaima roaima 0 Jan 7 10:01 a/b/c
與往常一樣,這個函式可以獨立地放入你的某個可執行腳本中
$PATH
:#!/bin/bash mkdirs() { ...as above... } mkdirs "$@"