Ganti find
Anda perintah dengan ini dan coba lagi,
find /var/log -type f -mtime +7
Ini akan berhasil:
#!/bin/bash
files=()
while IFS= read -r -d $'\0'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime +7 -print0)
tar cvfz backup.tar.gz "${files[@]}"
Perhatikan penggunaan "${files[@]}"
sebagai kebalikan dari ${files[*]}
. "${files[@]}"
akan diperluas untuk menyediakan tar
dengan satu argumen per nama file dan akan berfungsi meskipun nama file berisi spasi, tab, atau baris baru. Sebaliknya, setelah shell memperluas ${files[*]}
, itu akan melakukan pemisahan kata, berpotensi mengacaukan nama file Anda.
Untuk penjelasan mendetail tentang loop yang digunakan untuk membuat files
array, lihat:Bagaimana saya bisa menyimpan hasil perintah find sebagai array di Bash
Semua file dan direktori dihasilkan oleh perintah find /var/log/ -mtime +7
akan disertakan dalam tar
mengajukan. Untuk menyertakan hanya file, bukan direktori, lihat jawaban Skynet.
Untuk mengarsipkan log dari tujuh hari terakhir
Hanya satu karakter yang perlu diubah:
#!/bin/bash
files=()
while IFS= read -r -d $'\0'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime -7 -print0)
tar cvfz backup.tar.gz "${files[@]}"
Ini berfungsi karena find
menginterpretasikan argumen numerik sebagai berikut:
Argumen numerik dapat ditentukan sebagai
+n untuk lebih dari n,
-n kurang dari n,
n untuk tepat n.
Jadi, -mtime +7
berarti lebih dari 7 hari sementara -mtime -7
berarti kurang dari 7. Perhatikan bahwa find
akan mengabaikan bagian pecahan. Jadi +7
akan mencakup 8 hari tetapi tidak 7,5 hari. Lihat man find
untuk detailnya.