Saya memiliki folder tempat saya mencadangkan basis data dan saya ingin menghapus semua cadangan yang dibuat antara pukul 11 pagi dan 3 sore dan tidak peduli hari apa sekarang — ini masalahnya!
Saya menemukan perintah ini sangat membantu, tetapi tidak dalam kasus penggunaan saya:
find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete
Tapi di sini memaksa saya untuk interval antara dua tanggal! Saya hanya ingin menghapus cadangan yang dibuat antara dua waktu tertentu.
Jawaban yang Diterima:
Cukup sederhana, mengingat Anda telah menandai linux, Anda memiliki stat
perintah yang tersedia, yang akan mengekstrak waktu modifikasi file, dan date
GNU perintah, yang akan mengekstrak jam dari waktu tertentu:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -ls
Jika hasilnya terlihat benar, maka:
find . -type f -exec sh -c '
h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]'
sh {} ; -delete
Berikut uji coba dengan -ls
versi:
$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} ; -ls
1705096 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./11am
1705097 0 -rw-r--r-- 1 user group 0 Sep 12 2018 ./12pm
Penghargaan untuk Kusalananda karena telah menulis jawaban luar biasa yang saya ikuti, di:Memahami opsi -exec dari `find`
Perhatikan bahwa kami tidak ingin {} +
versi find
di sini, seperti yang kita inginkan -exec
hasilnya menjadi per-file, sehingga kita hanya menghapus file yang sesuai dengan rentang waktunya.
Skrip shell yang disematkan memiliki dua bagian utama:tentukan stempel waktu "jam" file dan kemudian kembalikan keberhasilan atau kegagalan berdasarkan rentang. Bagian pertama itu sendiri diselesaikan dalam dua bagian. Variabel diberikan hasil dari substitusi perintah; perintah harus dibaca dari dalam ke luar:
$(stat -c %Y "$1")
— substitusi perintah (kedua) ini memanggilstat
pada$1
parameter skrip shell yang disematkan;$1
ditugaskan olehfind
sebagai salah satu nama path yang ditemukannya. Opsi %Y kestat
perintah mengembalikan waktu modifikasi dalam detik-sejak-epoch.date -d @ ... +%-H
— ini mengambil detik-sejak-zaman dari substitusi perintah di atas dan menanyakandate
untuk memberi kami bagian Jam dari waktu itu;@
sintaks memberitahudate
bahwa kami memberikannya detik-sejak-zaman sebagai format input. Dengan-
opsi dalam format keluaran tanggal, kami memberi tahu tanggal GNU ke tidak pad nilai dengan nol di depan. Ini mencegah salah tafsir oktal di kemudian hari.
Setelah kita memiliki $h
Variabel jam ditetapkan, kami menggunakan operator kondisional bash [[
untuk menanyakan apakah nilai tersebut lebih besar dari atau sama dengan 11 dan juga sangat kurang dari 15.