Saya memiliki daftar folder yang memiliki tanggal untuk nama. Tanggal dalam format YYYYMMDD (mis. 20150129). Di dalam folder-folder ini terdapat dokumen teks yang terkait dengan tanggal tertentu.
Saya ingin merestrukturisasi mereka dalam hierarki folder dari tahun ke bulan hingga saat ini, dan untuk memindahkan dokumen teks ke folder 'tanggal' yang sesuai lebih rendah dalam hierarki.
Dengan kata lain saya ingin folder 'root' dinamai setelah tahun seperti 2015, dan kemudian membuat sub-folder bernama dengan bulan seperti 01, dan kemudian membuat sub-folder lebih lanjut bernama dengan tanggal seperti 29 yang menyimpan dokumen teks yang sesuai .
Jadi jalan akan terlihat seperti 2015/01/29/file.txt
atau 2015>01>29>file.txt
.
Saya telah melihat Automator dan sepertinya sesuatu seperti ini tidak mungkin walaupun saya mungkin salah, jadi saya ingin tahu ...
Apakah ada solusi mudah untuk masalah ini yang dapat dipahami oleh orang awam, misalnya alur kerja Automator, atau apakah ini memerlukan pemahaman tentang perintah terminal dan ekspresi reguler?
Bagaimana orang memecahkan masalah ini asalkan ada solusi?
Jawaban:
Dengan asumsi semua folder YYYYMMDD ini adalah bagian dari direktori induk yang sama yang dapat Anda jalankan
for d in */; do
Loop membaca semua entri direktori, trailing/
memastikan bahwa hanya nama direktori benar-benar sesuai[[ $d =~ [0-9]{8}/ ]]
menguji apakah entri saat ini terdiri dari 8 digit, dan berlanjut dengan entri berikutnya jika tidak${d:0:4}/${d:4:2}/${d:6:2}
menggunakan ekspansi parameter di dalambash
untuk membuat string yang berisi jalur baru--
keduanyamkdir
danmv
mencegah masalah jika direktori atau nama file dimulai dengan a-
. Ini tidak bisa terjadi di sini, tapi mungkin itu praktik yang baik.Terima kasih kepada @terdon dan @ user3439894 untuk ide tentang cara meningkatkan skrip asli.
sumber
Anda dapat menggunakan yang berikut ini di Terminal.
cd
ke folder yang berisi, kemudian jalankan yang berikut:find . -type f
memperoleh setiap file di direktori saat ini secara rekursif.-exec bash -c
membuka shell untuk menjalankan perintah berikut.F=$(…)
membuka subkulit dan menggunakan sed pada path file untuk memanipulasi path ke dalam folder.^\./([0-9]{4})([0-9]{2})([0-9]{2})
adalah regex dengan tiga kelompok tangkap, sebagai berikut: adalah pengganti, di mana setiap kelompok tangkap ( , dll) dipisahkan oleh . membuat direktori untuk memindahkan file ke. memindahkan setiap file ke folder terkait.\1/\2/\3
\1
/
mkdir -p -- $(dirname "$F")
mv -- "$1" "$F"
Ini mengambil hierarki di sebelah kiri dan mengubahnya menjadi hierarki di sebelah kanan:
Jika ada file lain di folder yang berisi dengan tanggal sebagai nama, mereka akan dipindahkan seolah-olah mereka adalah folder. Untuk mencegah hal ini, ganti baris kedua dengan:
The
(?:/.+)
memastikan bahwa path memiliki komponen berikutnya, karena itu mengabaikan apa pun tanpa anak di direktori induk yang merupakan file.sumber