Permissions

如何在一個命令中創建多個嵌套目錄並定義所有目錄的權限?

  • January 10, 2022

在 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都將失敗:此類目錄是使用不允許寫入的權限創建的,因此無法創建下一級目錄。

最後,一個bashshell 腳本還可以為您提供在一個命令中創建多個目錄的功能,方法是將復雜性包裝在一個函式中。這將嘗試從下到上將權限應用於新創建的目錄,因此最終可能會得到沒有寫權限的目錄:

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 "$@"

引用自:https://unix.stackexchange.com/questions/685385