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
次はどうですか?
#!/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で複数回指定するだけです。
使用 -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行にすることができます)