web-dev-qa-db-ja.com

Linuxで日付に従ってフォルダを作成するにはどうすればよいですか?

Linuxで次のことを行うための他の短くて簡単で賢い方法はありますか?

cd /home/abcd/dammi
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)
# RESULT : /home/abcd/dammi/2011-05/26
cd /home/wxyz/harrami
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)
cd /home/abcd/harrami
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)
cd /home/wxyz/harrami
mkdir $(date +%Y-%m)
cd $(date +%Y-%m)
mkdir $(date +%d)

Crontabを使用して、/ home/abcd/dammi、/ home/abcd/harrami、/ home/wxyz/dammi、および/ home/wxyz/harrami内に毎日および毎月フォルダーを作成する必要があります。誰かがこれで私を助けることができますか?

情報:

    GROUPS : USERS
--------------------
    abcd  : abcd
    wxyz  : dammi, harrami
4
Himalay

次はどうですか?

#!/bin/bash
HOME_DIRS="/home/abcd/dammi /home/wxyz/harrami /home/abcd/harrami /home/wxyz/harrami"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for FOLDER in $HOME_DIRS; do
    mkdir -p "${FOLDER}/${DATE_DIR}/${DAY_DIR}"
done

もちろん、DATE_DIR変数とDAY_DIR変数がなくても実行できますが、このアルゴリズムにより、日付が何度も生成されないことが保証され、すべてのユーザーの日付が同じになることが保証されます。真夜中の直前に開始し、最後のディレクトリが真夜中の後に作成された場合)。

また、ユーザーが新しく作成されたディレクトリに書き込めるようにするために、chownを使用してスクリプトを拡張することを検討する必要があるかもしれません。

編集:2つの/homeサブフォルダー内に同じフォルダー構造を作成する場合は、RolKauのスクリプトを私のスクリプトと組み合わせることができます。

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
    done
done

Edit2:ユーザーリストにはユーザー名が含まれていると思います。それでは、スクリプトを拡張して、ディレクトリ所有者も適切に変更されるようにします。

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        chown -R "${U}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

Edit3:所有権を変更するには、/home/<subdir>/<user>のディレクトリから所有権を読み取るのが最も簡単な方法だと思います。

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        GROUP_MEMBER=$(stat -c %G "/home/${HOME_SUBDIR}/${U}")
        chown -R "${U}":"${GROUP_MEMBER}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

確かに、statを使用して所有者を読み取ることもできます。しかし、それは変数からそれを読み取るよりも少し遅いです-あなたがそれを求めたように:

#!/bin/bash
USER_LIST="dammi harrami"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for U in $USER_LIST; do
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        OWNER=$(stat -c %U "/home/${HOME_SUBDIR}/${U}")
        GROUP_MEMBER=$(stat -c %G "/home/${HOME_SUBDIR}/${U}")
        chown -R "${OWNER}":"${GROUP_MEMBER}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

Edit4:ハードコードされたグループメンバーシップを使用した代替ソリューション。

#!/bin/bash
USER_LIST="dammi:group1 harrami:group2"
HOME_SUBDIRS="abcd wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for HOME_SUBDIR in $HOME_SUBDIRS; do
    for UG in $USER_LIST; do
        G=${UG##*:}
        U=${UG%%:*}
        mkdir -p "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}/${DAY_DIR}"
        GROUP_MEMBER=$(stat -c %G "/home/${HOME_SUBDIR}/${U}")
        chown -R "${U}":"${G}" "/home/${HOME_SUBDIR}/${U}/${DATE_DIR}"
    done
done

Edit5:最初の投稿を見ると、目的の構造が少し異なる場合があります。グループごとに/homeにサブディレクトリを作成し、グループメンバーごとにユーザーディレクトリのみを追加したいと思います。だからここに行きます:

#!/bin/bash
USER_LIST="dammi:abcd dammi:wxyz harrami:wxyz"
DATE_DIR=$(date +%Y-%m)
DAY_DIR=$(date +%d)

for UG in $USER_LIST; do
    G=${UG##*:}
    U=${UG%%:*}
    mkdir -p "/home/${G}/${U}/${DATE_DIR}/${DAY_DIR}"
    chown -R "${U}":"${G}" "/home/${G}/${U}/${DATE_DIR}"
done

ユーザーが複数のグループのメンバーである場合は、USER_LISTで複数回指定するだけです。

4
SkyBeam

使用 -p mkdirのオプションを使用して、一度にパスの複数の要素を作成し、forループを使用して繰り返しを回避します。

sh -c '
  for a in abcd wxyz; do 
    for b in dammi harrami; do 
      mkdir -p /home/$a/$b/$(date +%Y-%m)/$(date +%d); 
    done; 
  done
'

(論理構造を示すための改行。すべてを1行にすることができます)

3
RolKau