在 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
答案1
那么以下内容呢:
#!/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 增强脚本,以允许用户写入新创建的目录。
编辑:如果您想在两个/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
编辑2:我假设用户列表包含用户名。因此,让我们扩展脚本,以便目录所有者也能正确更改:
#!/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
编辑3:要更改所有权,我认为最简单的方法是从目录中读取所有权/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
编辑4:使用硬编码组成员资格的替代解决方案。
#!/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
编辑 5:查看您的初始帖子,所需的结构可能略有不同。我猜您想为每个组设置一个子目录/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 中多次指定它。
答案2
使用-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
'
(换行显示逻辑结构;可以全部在一行上)