如何在Linux中根据日期创建文件夹?

如何在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

答案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

使用-pmkdir 选项一次创建路径的多个元素,并使用 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
'

(换行显示逻辑结构;可以全部在一行上)

相关内容