Kabuk Betiği - <tarih> sonrasında değiştirilen tüm dosyaları al


136

Ben bu yüzden PHP'de bunu yapmazdım, bu yüzden kabuk komut dosyalarında iyi birisinin yardımcı olabileceğini umuyorum.

Ben dizin üzerinden özyinelemeli çalışır ve son değiştirilme tarihi olan tüm dosyaları bulur bazı tarihten daha büyük bir komut dosyası gerekir. Ardından, yol bilgilerini koruyarak dosya (ları) tarlayıp sıkıştırır.


14
PHP bunu yapmak için iyi bir karar.
Krediler

1
Php başvurmadan, örneğin python, yakut, perl iyi kabuk komut dosyası dillerinden herhangi birini kullanabilirsiniz.
099

3
@garrow Bu aslında bir FilterIterator içine alınmış bir RecursiveDirctoryIterator kullanarak PHP'de oldukça basit olurdu.
Artefacto

Yanıtlar:


136

kadar basit:

find . -mtime -1 | xargs tar --no-recursion -czf myfile.tgz

burada find . -mtime -1(özyinelemeli) geçerli dizindeki bir önceki gün değiştirilen tüm dosyaları seçer. kesirler kullanabilirsiniz, örneğin:

find . -mtime -1.5 | xargs tar --no-recursion -czf myfile.tgz

4
Dosya adlarınızdaki boşluklarla nasıl başa çıkacağınız için aşağıdaki user104848'in cevabına bakın
Brian Henk

8
Keyfi bir zaman damgasını kesirli, göreli bir zamana dönüştürmek ne doğru ne de özellikle uygun görünmektedir. Kullanarak aşağıdaki çözüm -newermtolduğunu çok güzel.
Bobby Jack

5
Dizinleri olan bir yapıdaki değişikliklerle herhangi bir dosyayı ayıklamaya çalışırken, dizinlerin kendileri değiştirilmiş olarak işaretlenir ve tüm klasör arşivlenir. -type fYalnızca belirli dosyalara ekleyin . Bu, klasör yapısını korur, ancak yalnızca değişiklik içeren dosyaları yedekler.
Brent

1
@BrianHenk user104848 adlarını değiştirdi, eminim bu cevabı (şu anda) Jason Luther olsa da
kastediyorum

4
Soru, dosyaları keyfi bir tarihe göre bulmayı ister. Bu yanıt, dosyaları geçmişte gelişigüzel sayıda güne göre nasıl bulacağınızdır. Bir tarihi bir gün deltasına dönüştürmek için bir adım eklemeden bunun kabul edilen cevap olması gerektiğini düşünmüyorum.
Mark

91

GNU'yu varsa find, o zaman ilgili seçenekler lejyon vardır. Tek engel, onlara arayüzün yıldızdan daha az olmasıdır:

  • -mmin n (değişiklik süresi dakika olarak)
  • -mtime n (gün cinsinden değişiklik süresi)
  • -newer file (değişiklik zamanı dosyanın değişiklik süresinden daha yeni)
  • -daystart (başlangıç ​​zamanını günün saatinden günün başlangıcına ayarlayın)
  • Ayrıca erişim zamanı ve 'değiştirme' veya 'oluşturma' zamanı için alternatifler.

Zor kısım, bir zamandan bu yana geçen dakika sayısını belirlemek.

Dikkate değer bir seçenek: touchgerekli değişiklik zaman damgasına sahip bir dosya oluşturmak için kullanın ; Sonra kullanmak findile -newer.

touch -t 200901031231.43 /tmp/wotsit
find . -newer /tmp/wotsit -print
rm -f /tmp/wotsit

Bu, 2009-01-03T12: 31: 43'ten daha yeni dosyaları arar. Açıkça, bir komut dosyasında, /tmp/wotsitbenzersiz kılmak için PID veya başka bir değere sahip bir ad olacaktır; trapkullanıcı kesilse bile kaldırılmasını sağlamak için bir yol olurdu , vb.


65
Bunun yerine, -newermt '2009-01-03T12:31:43'yalnızca başvuru amacıyla bir dosya oluşturma gereğini ortadan kaldırmak için kullanabilirsiniz .
Michael Mior

@MichaelMior: İlginç - MacOS X 10.7.2 desteklerindeki 'bul' -newermt( -newerXYbirden fazla seçenek olduğu için belgelenmiştir ; X = m, Y = t bu durumda). Kullandığım (neredeyse arkaik) Linux sistemlerinde GNU bulgusu seçenekleri desteklemiyor, bu yüzden nispeten yeni bir varış. Söylediğin için teşekkürler.
Jonathan Leffler

Bu seçenek sistemimde kullandığım GNU find 4.4.2'de mevcut.
Michael Mior

2
Ayrıca GNU bulgunun göreceli zamanları da desteklediğini unutmayın. -newermt '-2 weeks'.
Cybolic

1
-newermt '2009-01-03T12:31:43'harika görünüyor, ancak ne yazık ki her şeyi yanlış saat diliminde yorumluyor
antoine

35

Bunu doğrudan katranla ve daha da iyisi ile yapabilirsiniz:

tar -N '2014-02-01 18:00:00' -jcvf archive.tar.bz2 files

Bu, tar'a 1 Ocak 2014, 18:00:00 'den daha yeni dosyaları sıkıştırma talimatı verir.


9
Hah ... 1984'ten beri Unix kullanıyorum ve bunu hiç bilmiyordum. Her zaman öğrenilecek bir şey.
John

tarOS X ve FreeBSD ile gelen uygulamalar sadece GNU --neweriçin uzun seçenek olanı desteklemektedir . -Ntar
nisetama

Bu harika ... Sadece -zcvf ve bir gz uzantısı kullanmadan bzip ile çalışabildim ... ama uzman değilim.
phil

17

Bu, birkaç dosya için işe yarayacaktır. Yollardan herhangi birinin içinde boşluk olması durumunda "-print0" ve "xargs -0" ifadelerini dahil etmek istersiniz. Bu örnek, son 7 gün içinde değiştirilen dosyaları arar. Son 7 gün önce değiştirilenleri bulmak için "+7" kullanın.

find . -mtime -7 -print0 | xargs -0 tar -cjf /foo/archive.tar.bz2

Gibi bu sayfayı uyarır, Xargs argümanları bir sürü varsa tar komutu birden çok kez yürütülecek neden olabilir ve "-c" bayrağı sorunlara neden olabilir. Bu durumda şunu istersiniz:

find . -mtime -7 -print0 | xargs -0 tar -rf /foo/archive.tar

Sıkıştırılmış bir tar arşivini tar ile güncelleyemezsiniz, bu nedenle ikinci bir adımda bzip2 veya gzip yapmanız gerekir.


1
İkinci nokta ile ilgili olarak, sıkıştırılmış arşivleri de güncellemek için Gnu tar'ın -z seçeneği gibi gzip özellikli bir tar komutu kullanabilirsiniz.
Suncat2000

Veya son GNU katranlarında
bzip'i

3
Yukarıda Jonathan'ın cevabında söylediğim gibi, bu, tüm dosyaların içe aktarılmasına neden olan değişiklikler içeren klasörleri kapacak. -type fYalnızca belirli dosyalara ekleyin . Bu, klasör yapısını korur, ancak yalnızca son zamanlarda yapılan değişiklikler / eklenen dosyaları yedekler.
Brent

12

Bu, son 7 gün içinde değiştirilen tüm dosyaları göstermelidir.

find . -type f -mtime -7 -print

Katran / fermuar içine borulayın ve iyi olmalısınız.


4

7 gün önceki tüm yeni dosyaları yedeklemek için aşağıdakileri yapardım

tar --newer $(date -d'7 days ago' +"%d-%b") -zcf thisweek.tgz .

'7 gün önce' yerine ihtiyacınıza uygun herhangi bir şeyi de değiştirebilirsiniz

Olabilir : date -d'yesterday' +"%d-%b"

Ya da : date -d'first Sunday last month' +"%d-%b"


3

linux altında find komutunun adam sayfasını okumayı deneyin

man find

böyle bir şey olmalı

 find . -type f -mtime -7 -print -exec cat {} \; | tar cf - | gzip -9

ve sende var


3

En son x günden daha önce en son değiştirilen dosyaların bir listesini şu şekilde alabilirsiniz:

find . -mtime -x

Ardından, sonuç listesindeki dosyaları tar ve zip yapmanız yeterlidir, örneğin:

tar czvf mytarfile.tgz `find . -mtime -30`

geçen ay içinde değiştirilen tüm dosyalar için.


3
"-mtime x" günler önce tam olarak "x" ile değiştirilen dosyalarla eşleşir, "-mtime -x" ile "x" günden daha önce değiştirilmiş dosyaları eşleştirir.
Lance Richardson

2

Bu komut dosyası, belirtilen tarihten iki dakika önce ve sonra değiştirme tarihine sahip dosyaları bulur (ve koşullardaki değerleri gereksiniminize göre değiştirebilirsiniz)

PATH_SRC="/home/celvas/Documents/Imp_Task/"
PATH_DST="/home/celvas/Downloads/zeeshan/"

cd $PATH_SRC
TODAY=$(date  -d "$(date +%F)" +%s)
TODAY_TIME=$(date -d "$(date +%T)" +%s)


for f in `ls`;
do
#       echo "File -> $f"
        MOD_DATE=$(stat -c %y "$f")
        MOD_DATE=${MOD_DATE% *}
#       echo MOD_DATE: $MOD_DATE
        MOD_DATE1=$(date -d "$MOD_DATE" +%s)
#       echo MOD_DATE: $MOD_DATE

DIFF_IN_DATE=$[ $MOD_DATE1 - $TODAY ]
DIFF_IN_DATE1=$[ $MOD_DATE1 - $TODAY_TIME ]
#echo DIFF: $DIFF_IN_DATE
#echo DIFF1: $DIFF_IN_DATE1
if [[ ($DIFF_IN_DATE -ge -120) && ($DIFF_IN_DATE1 -le 120) && (DIFF_IN_DATE1 -ge -120) ]]
then
echo File lies in Next Hour = $f
echo MOD_DATE: $MOD_DATE

#mv $PATH_SRC/$f  $PATH_DST/$f
fi
done

Örneğin belirli bir tarih sadece, sen değişebilir önce dosyaları değiştirme tarihini sahip istemek 120için 0de $DIFF_IN_DATEşartlarını atarak parametresi $DIFF_IN_DATE1parametresi.

Benzer şekilde, dosyaların sadece yerine, 1 saat önce ve belirli bir tarihten sonraki değiştirme tarihini sahip isterseniz 120tarafından 3600içinde if CONDITION.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.