Como criar pastas de acordo com a data no Linux?

4

Existe alguma outra forma curta / mais fácil e mais inteligente de fazer o seguinte no 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)

Eu preciso usar o crontab para criar pastas todos os dias e todos os meses dentro de / home / abcd / dammi, / home / abcd / harrami, / home / wxyz / dammi e / home / wxyz / harrami. Alguém pode me ajudar com isso?

Informação:

    GROUPS : USERS
--------------------
    abcd  : abcd
    wxyz  : dammi, harrami
    
por Himalay 26.05.2011 / 23:13

2 respostas

4

E o seguinte:

#!/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

Bem, é claro que você também pode fazer isso sem as variáveis DATE_DIR e DAY_DIR , mas este algoritmo garante que a data não seja gerada muitas vezes, o que é mais rápido e garante que a data seja a mesma para todos os usuários você começa logo antes da meia-noite e o último diretório é criado depois da meia-noite).

Você também deve pensar em aprimorar o script usando o chown para permitir que os usuários gravem nos diretórios recém-criados.

Editar: Se você quiser criar a mesma estrutura de pastas dentro de duas sub-pastas /home você pode combinar o script de RolKau com o meu:

#!/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

Editar2: Eu suponho que a lista de usuários contenha os nomes de usuários. Então, vamos estender o script para que o proprietário do diretório seja alterado corretamente:

#!/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

Editar3: Para alterar a propriedade, acho que a maneira mais fácil é ler a propriedade do diretório em /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

Claro que você pode usar stat também para ler o dono; mas é um pouco mais lento do que apenas ler a variável - como você pediu:

#!/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: Solução alternativa usando membros do grupo codificados.

#!/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

Editar5: Olhando para o seu post inicial, a estrutura desejada pode ser ligeiramente diferente. Eu acho que você quer ter um subdiretório em /home para cada grupo e apenas adicionar diretórios de usuários para cada membro do grupo. Então aqui vai:

#!/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

Se um usuário é membro em vários grupos, basta especificá-lo várias vezes em USER_LIST.

    
por 26.05.2011 / 23:20
3

Use a opção -p para mkdir para criar mais de um elemento do caminho no momento e use um loop for para evitar a repetição:

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
'

(quebra de linha para mostrar estrutura lógica; pode ser tudo em uma linha)

    
por 26.05.2011 / 23:20