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 persis 2015
, 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 ke find
.
Jika ada file yang secara langsung terkandung dalam direktori saat ini ( file yang Anda gunakan saat menjalankan find ...
perintah itu) yang namanya berisi 2015
(dan tidak dimulai dengan a .
), maka shell diperluas *2015*
ke daftar nama-nama file tersebut, kemudian diteruskan daftar itu sebagai argumen untuk find
. Ini bukan yang Anda inginkan - sebagai gantinya, Anda ingin menyampaikan *2015*
secara harfiah sebagai argumen untuk ditemukan, sehingga find
, 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:
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:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
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
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
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 dengan find
'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.
find . -name '*2015*' -mmin +1440 -ls
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:
find . -name '*2015*' -mmin +1440
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 ...)