Saya ingin membuat daftar semua file log yang bukan milik hari ini dan hanya file yang berisi 2015
nama mereka.
Ini adalah perintah yang saya coba:
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
Output dari keduanya tidak ada apa-apanya, tetapi masih ada file di sana. Ada yang salah dengan perintah ini, dan saya tidak mendapatkan apa. Bantuan apa pun akan dihargai.
command-line
find
rɑːdʒɑ
sumber
sumber
find
terlihat bagus untuk saya, tetapi saya juga punya masalah dengan-exec
parameternya. Saya juga tidak bisa membuatnya bekerja. (Saya mencoba untuk memindahkan semua file jpg dari satu folder ke direktori induknya melalui itu - dan akhirnya melakukannya secara manual ...)2015
nama mereka (kelemahan jelas lainnya dari jalan perintah tertulis) saya menduga akan ada beberapa jenis output. Jadi, Anda mungkin ingin memposting jawaban tentang itu.Jawaban:
Perintah
find . -name '*2015*' -mmin +1440 -ls
mungkin akan melakukan apa yang Anda inginkan. Lihat di bawah untuk detailnya.Perintah pertama Anda
-name 2015
. Itu tidak berfungsi karena hanya menemukan file yang namanya persis2015
, tanpa karakter lain di dalamnya.Perintah kedua Anda
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
,, mungkin gagal karena beberapa alasan:1.
*
Karakter yang tidak dikutip diperluas oleh shell, lalu diteruskan kefind
.Jika ada file yang secara langsung terkandung dalam direktori saat ini ( file yang Anda gunakan saat menjalankan
find ...
perintah itu) yang namanya berisi2015
(dan tidak dimulai dengan a.
), maka shell diperluas*2015*
ke daftar nama-nama file tersebut, kemudian diteruskan daftar itu sebagai argumen untukfind
. Ini bukan yang Anda inginkan - sebagai gantinya, Anda ingin menyampaikan*2015*
secara harfiah sebagai argumen untuk ditemukan, sehinggafind
, dan bukan shell, dapat menemukan file mana yang cocok dengannya.Untuk memperbaiki masalah itu, kutip
*2015*
. Ada tiga cara umum untuk melakukannya:'*2015*'
(yaitu,find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)"*2015*"
(yaitu,find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)\*2015\*
(yaitu,find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)Saya sarankan menulis itu dengan tanda kutip tunggal sebagai
'*2015*'
, karena:\
dapat membuatnya sulit untuk melihat apa yang sedang diteruskan oleh shell kefind
perintah."
terkadang melibatkan aturan yang agak rumit .Tetapi dalam hal ini tidak terlalu penting.
'
dan"
keduanya memperlakukan*
hal yang sama dan ungkapannya tidak cukup rumit untuk\
dikutip sehingga sulit untuk dipahami.2.
-mtime +1
hanya memilih file yang dimodifikasi dua hari atau lebih yang lalu.Seperti
man find
kata:Misalkan file diubah 47 jam yang lalu. Untuk mengetahui berapa banyak 24 jam periode yaitu,
find
putaran bawah : itu adalah satu periode 24 jam yang lalu. Tetapi-mtime +1
hanya mencocokkan file yang waktu modifikasi ketat lebih dari satu periode 24 jam yang lalu. Dengan demikian file dari kemarin tidak cocok.Lihat Mengapa menemukan -mtime +1 hanya mengembalikan file yang lebih tua dari 2 hari? untuk informasi lebih lanjut, seperti yang disarankan oleh steeldriver .
Untuk menemukan file yang terakhir dimodifikasi kapan saja lebih dari 24 jam yang lalu , saya sarankan menetapkannya 1440 menit yang lalu dengan
-mmin +1440
:Beberapa pembaca mungkin bertanya-tanya mengapa saya tidak mengutip
{}
. Beberapa orang mengutip{}
untuk mengingatkan manusia bahwa itu bukan ekspresi untuk ekspansi penjepit . Kerang bergaya Bourne (seperti bash ) tidak perlu{}
dikutip di dalamnya. Mungkin beberapa shell non-Bourne-style memang memperlakukannya secara khusus; mungkin itulah sebabnya beberapa pengguna mengutipnya. Tetapi ada juga kesalahpahaman yang kadang-kadang harus dikutip{}
sehingga-exec
menangani nama file dengan spasi dengan benar. Itu salah: dengan{}
atau'{}'
,find
mendapatkan argumen yang sama , ketika shell menghapus tanda kutip sebelum diteruskan'{}'
kefind
. Untuk mengatasi kesalahpahaman ini, saya tidak mengutip{}
, tetapi ini masalah gaya - jika Anda lebih suka{}
mendokumentasikan bagaimana shell tidak memperlakukan{
dan}
khususnya, itu baik-baik saja.Saya sarankan Anda juga baik mengubah Anda
ls
perintah, atau (seperti Muru telah menyarankan ) menggantinya denganfind
's-ls
tindakan.ls -ltrh
mungkin tidak melakukan apa yang Anda inginkan karena dijalankan secara terpisah untuk setiap file yang ditemukan sehingga flag-t
dan-r
, yang menentukan penyortiran, tidak relevan.Meskipun output akan diformat sedikit berbeda dari dengan
ls -l
, menggunakan-ls
lebih sederhana dan lebih mudah.Atau jika Anda memutuskan untuk benar-benar hanya perlu mencantumkan nama file (termasuk jalurnya, relatif terhadap
.
), Anda dapat dengan mudah menentukan tidak ada tindakan, yang menyebabkan-print
tindakan default digunakan:sumber
newerXY
sintaksis, yang menerima argumen kalender mis-newermt 'yesterday'
dan! -newermt 'yesterday'
Mengutip ekspresi dan saya sarankan Anda mengutip tanda kurung juga
atau
Anda tidak perlu meneruskan file yang Anda temukan ke ls
sumber
-type f
? Dan jikals
harus digunakan, sarankan menggunakan-ls
.Di zsh , Anda dapat menggunakan kualifikasi glob (ini adalah fitur zsh yang unik, tidak tersedia di shell lain seperti bash).
Ini hanya mencantumkan file dalam direktori saat ini; untuk menelusuri direktori secara rekursif , gunakan
Dengan
find
,-name 2015
hanya menemukan file yang namanya persis2015
.-name *2015*
hanya berfungsi jika tidak ada file yang namanya berisi2015
dalam direktori saat ini, karena shell memperluas pola*2015*
sebelumfind
dipanggil. Anda perlu mengutip polanya:Perhatikan bahwa keduanya
find -mtime +1
dan zsh's*(m+1)
menemukan file yang berusia setidaknya 48 jam , bukan file yang lebih tua dari hari ini. Tanda plus berarti "lebih dari" dan jumlah hari dibulatkan. Untuk menemukan file yang berusia minimal 24 jam, gunakan-mtime +0
atau(m+0)
.Jika Anda ingin menemukan file yang terakhir dimodifikasi kemarin atau sebelumnya , Anda dapat menggunakan
find
dengan-newermt
predikat :Tidak ada cara yang benar-benar nyaman untuk melakukan tes ini di zsh.
sumber