Linuxでは、次の2つのコマンドが期待どおりに機能します。
mkdir -m 555 new_directory
mkdir -p a/b/c
しかし、以下はうまくいきません予想通り:
mkdir -m 555 -p a/b/c
3つのディレクトリが作成されましたが、最新のディレクトリにのみ555
権限があります。a
ディレクトリにはデフォルトb
権限があります。
それでは、タイトルに記載されている目標をどのように達成しますか?可能ですか?
ところで -555
ランダムなケースを選択しましたが、666
やはり777
失敗しました。
ベストアンサー1
ディレクトリを明示的に一覧表示すると(親ディレクトリが最初に)、1つのコマンドでディレクトリを作成するという指定された目標を達成できます。
mkdir -m 555 -p a a/b a/b/c
cshスタイルの中かっこ拡張をサポートするシェルを使用すると、bash
操作を少し簡素化できますが、読みやすさが低下します。
mkdir -m 555 -p a{,/b{,/c}}
しかし、参考にしてください。特権の場合、555
両方のコマンドは失敗します。親ディレクトリを作成する必要がある場合:これらのディレクトリは書き込みを許可しない権限で作成されるため、下位レベルのディレクトリを作成できません。
最後に、bash
シェルスクリプトは複雑さを関数にラップして、単一のコマンドで要求に応じて複数のディレクトリを作成する機能を提供できます。これにより、新しく作成されたディレクトリに権限を下から上に適用しようとするため、書き込み権限のないディレクトリになる可能性があります。
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 "$@"