1つのコマンドで複数のネストしたディレクトリを作成し、すべての権限を定義する方法は?

1つのコマンドで複数のネストしたディレクトリを作成し、すべての権限を定義する方法は?

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

おすすめ記事