GNU/Linux >> Belajar Linux >  >> Linux

Linux – Bagaimana Cara Menghapus File yang Dibuat Antara Dua Kali?

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:

  1. $(stat -c %Y "$1") — substitusi perintah (kedua) ini memanggil stat pada $1 parameter skrip shell yang disematkan; $1 ditugaskan oleh find sebagai salah satu nama path yang ditemukannya. Opsi %Y ke stat perintah mengembalikan waktu modifikasi dalam detik-sejak-epoch.
  2. date -d @ ... +%-H — ini mengambil detik-sejak-zaman dari substitusi perintah di atas dan menanyakan date untuk memberi kami bagian Jam dari waktu itu; @ sintaks memberitahu date 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.
Terkait:Debian Lenny:Ingin Splashy memulai langsung setelah Grub2?

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.


Linux
  1. Cara Mentransfer File Antara Dua Komputer menggunakan Perintah nc dan pv

  2. Cara Menghapus File BESAR (100-200GB) di Linux

  3. Cara Mengganti Nama File di Linux

  1. Cara Menghapus File dengan Ekstensi Tertentu di Baris Perintah Linux

  2. Cara mendapatkan perbedaan (hanya penambahan) antara dua file di linux

  3. Bagaimana Anda menghapus file yang lebih lama dari tanggal tertentu di Linux?

  1. Cara Menghapus File dan Direktori di Linux dari Command Line

  2. Cara Membuat File Dengan Ukuran Tertentu Di Linux

  3. Bagaimana cara Menghapus semua file yang lebih lama dari X jumlah Hari di Linux?