Komut find . -name '*2015*' -mmin +1440 -ls
muhtemelen istediğinizi yapar. Ayrıntılar için aşağıya bakın.
İlk emriniz vardı -name 2015
. Bu, işe yaramadı çünkü yalnızca adları tam olan 2015
, içinde başka karakter bulunmayan dosyaları bulur .
İkinci komutunuz, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
birkaç nedenden dolayı başarısız olmuş olabilir:
1. Alıntılanmamış *
karakterler kabuk tarafından genişletilir ve daha sonra 'e aktarılır find
.
Doğrudan geçerli dizinde (bu find ...
komutu çalıştırdığınızda bulunduğunuz dosya ) isimleri içeren 2015
(ve a ile başlamamış .
) herhangi bir dosya varsa, kabuk*2015*
bu dosya adlarının bir listesine genişledi ve sonra geçti bu listeyi argüman olarak find
. İstediğiniz bu değil - bunun yerine, *2015*
kelimenin tam anlamıyla bulmak için bir argüman olarak geçmek istersiniz , böylece find
kabuk değil, hangi dosyaların kendisiyle eşleştiğini bulabilir.
Bu sorunu çözmek için alıntı yapın *2015*
. Bunu yapmanın üç yaygın yolu vardır:
'*2015*'
(yani, find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)
"*2015*"
(yani, find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)
\*2015\*
(yani, find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)
Ben öneririz yazmayı tek tırnak ile olduğu gibi '*2015*'
, çünkü:
Ancak bu durumda önemli değil. '
ve "
her ikisi *
de aynı şekilde davranır ve ifade, \
alıntıyı anlamayı zorlaştıracak kadar karmaşık değildir .
2. -mtime +1
yalnızca iki veya daha fazla gün önce değiştirilmiş dosyaları seçer .
As man find
diyor ki:
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.
Bir dosyanın 47 saat önce değiştirildiğini varsayalım. Kaç 24 saat olduğu dönemlerde, anlamaya find
mermi aşağı : öyle bir 24 saatlik dönem önce. Ancak -mtime +1
yalnızca değişiklik süreleri 24 saatten daha uzun bir süre önce olan dosyalarla eşleşir . Böylece dünden gelen dosyalar eşleşmez.
Bkz. Find -mtime +1 neden yalnızca 2 günden daha eski dosyaları döndürüyor? steeldriver tarafından önerilen daha fazla bilgi için .
En son 24 saat önce herhangi bir zamanda değiştirilen dosyaları bulmak için bunun yerine 1440 dakika önce şununla belirtilmesini öneriyorum -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Bazı okuyucular neden alıntı yapmadığımı merak ediyor olabilirler {}
. Bazı insanlar {}
, insanlara bunun genişlemenin bir ifadesi olmadığını hatırlatmayı teklif eder . Bourne tarzı mermiler ( bash gibi ) , içinde hiçbir şey belirtilmek zorunda değildir{}
. Belki Bourne tarzı olmayan bir kabuk özel olarak tedavi eder; bu yüzden bazı kullanıcılar bunu teklif eder. Ancak , bazen alıntı yapılması gereken yanlış bir kavram da vardır, bu {}
nedenle -exec
dosya adlarını boşluklarla doğru şekilde işler. Bu s sahte: ile {}
ya da '{}'
, find
alır aynı kabuk olarak, bağımsız değişkenler tırnak kaldırır geçirmeden önce '{}'
içinfind
. Bu yanlış anlama karşı koymak için, teklif etmiyorum {}
, ama bu bir stil meselesi - {}
kabuğun nasıl davranmadığını {
ve }
özellikle de özel olarak işlemediğini belgelemeyi tercih ederseniz , sorun değil .
Ben de ya da değiştirmek tavsiye ls
komutu veya (aynı muru önerdi ) ile değiştirin find
bireyin -ls
eylem. ls -ltrh
muhtemelen istediğiniz her şeyi yapmaz, çünkü bulunan her dosya için ayrı çalıştırılır ve bu nedenle sıralamayı belirten -t
ve -r
bayrakları önemsizdir.
Çıktı ,kinden biraz farklı biçimlendirilecek olsa da ls -l
, -ls
kullanımı daha basit ve kolaydır.
find . -name '*2015*' -mmin +1440 -ls
Veya yalnızca dosyanın adlarını listelemeniz gerektiğine karar verirseniz (göreceli olarak yolları dahil .
), hiçbir eylem belirtebilir ve varsayılan -print
eylemin kullanılmasına neden olabilirsiniz:
find . -name '*2015*' -mmin +1440
find
Bölüm bana iyi görünüyor, ama ben de ile ilgili sorunlar vardı-exec
parametre. Bunu da çalıştıramadım. (Tüm jpg dosyalarını bir klasörden üst dizinine taşımaya çalışıyordum - ve elle yaptım ...)