Bagaimana cara membuat folder sesuai tanggal di Linux?

4

Apakah ada cara lain yang singkat / mudah dan lebih cerdas untuk melakukan hal berikut di 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)

Saya perlu menggunakan crontab untuk membuat folder setiap hari dan setiap bulan di dalam / home / abcd / dammi, / home / abcd / harrami, / home / wxyz / dammi dan / home / wxyz / harrami. Adakah yang bisa membantu saya dengan ini?

Info:

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

Jawaban:

4

Bagaimana dengan yang berikut ini:

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

Yah, tentu saja Anda juga bisa melakukannya tanpa DATE_DIRdan DAY_DIRvariabel tetapi algoritma ini memastikan tanggal tidak dihasilkan berkali-kali yang lebih cepat dan memastikan tanggal sama untuk semua pengguna (bahkan jika Anda memulainya tepat sebelum tengah malam dan yang terakhir). direktori dibuat setelah tengah malam).

Anda mungkin juga harus berpikir tentang meningkatkan skrip menggunakan chown untuk memungkinkan pengguna menulis ke direktori yang baru dibuat.

Sunting: Jika Anda ingin membuat struktur folder yang sama dalam dua /homesub-folder, Anda dapat menggabungkan skrip RolKau dengan yang saya:

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

Sunting2: Saya menganggap daftar pengguna berisi nama-nama pengguna. Jadi mari kita memperluas skrip sehingga pemilik direktori juga berubah dengan baik:

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

Sunting3: Untuk mengubah kepemilikan saya pikir cara termudah adalah dengan membaca kepemilikan dari direktori di /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

Tentu Anda bisa menggunakan stat juga untuk membaca pemiliknya; tapi itu sedikit lebih lambat daripada hanya membacanya dari variabel - seperti yang Anda minta:

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

Sunting4: Solusi alternatif menggunakan keanggotaan grup yang dikode keras.

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

Sunting5: Melihat posting awal Anda struktur yang diinginkan mungkin sedikit berbeda. Saya kira Anda ingin memiliki sub-direktori /homeuntuk setiap grup dan hanya menambahkan direktori pengguna untuk setiap anggota grup. Jadi begini:

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

Jika pengguna adalah anggota dalam beberapa grup, cukup tentukan beberapa kali di USER_LIST.

SkyBeam
sumber
@ SkyBeam ya izin menyebabkan masalah sekarang. bagaimana cara mengatasinya?
Himalay
Cukup tambahkan baris chown lain - Saya telah memperbarui jawaban untuk menyertakan chown juga. Saya kira Anda tidak perlu mengubah kepemilikan grup. Jika harus, gunakan saja 'chwon -R "$ {U}": groupname ...' sebagai gantinya.
SkyBeam
@SkyBeam Saya punya dua grup berbeda untuk dua pengguna itu. Haruskah saya melakukannya secara terpisah untuk menambahkan loop lain?
Himalay
@SkyBeam sebenarnya ada tiga pengguna dan dua kelompok. Saya menambahkan pertanyaan di atas tentang itu.
Himalay
1
Anda juga dapat pergi hanya dengan satu permohonan 'kencan':$(date "+%Y-%M/%d")
glenn jackman
3

Gunakan -popsi untuk mkdir untuk membuat lebih dari satu elemen jalan pada saat itu, dan gunakan for-loop untuk menghindari pengulangan diri sendiri:

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
'

(garis-istirahat untuk menunjukkan struktur logis; bisa semuanya dalam satu baris)

RolKau
sumber
Jawaban yang bagus. Bahkan sedikit lebih cepat dari saya. Saya suka Anda mengulangi sub-direktori rumah juga. Namun dalam sampelnya ia membuat 3 kali subfolder "harrami" tetapi dammi tidak dibuat dalam folder "wxyz". Yah, ini mungkin bug di pertanyaan awal. Anda mungkin juga ingin memindahkan panggilan $ (tanggal) dari loop. Panggilan tanggal seharusnya mengembalikan nilai yang sama untuk setiap loop. $ () mengeluarkan fork yang bisa sangat lambat saat digunakan dalam loop.
SkyBeam
2
Anda juga dapat pergi hanya dengan satu permohonan 'kencan':$(date "+%Y-%M/%d")
glenn jackman
1
Banyak pemanggilan dateyang buruk dan tidak boleh dilakukan karena risiko perubahan tanggal. Bug teoretis masih merupakan bug.
Acumenus