2010-11-18 19 views
0

Bir dizin ağacındaki tüm dosyaların zaman damgasını bir saat kadar artırmaya çalışıyorum (DST değişikliğini düzeltmek için). Çatışmanın ve araştırmanın ardından, bulup, stat ve dokunuşla nasıl yapılacağını anladım, ama hepsini tek bir komuta soktuğumda başarısız oluyor.Bir araya getirme, stat ve touch'ı nasıl bir araya getirebilirim?

find ~/dir -type f -exec touch -m --date="$(stat -c '%y' '{}') + 3600 sec" '{}' \; 

veya, alternatif olarak, bağımsız değişken: komut

find $DIRNAME -type f -print0 | xargs -0 touch -m --date="$(stat -c '%y' '{}') + 3600 sec" 

ancak çalışmaz ve bir hata verir: istatistik: '} { `durumlanamadı: Böyle bir dosya ya da dizin

Kafamı bu duvara yarım günde vuruyorum. Herhangi bir öneri?

cevap

1
find $DIRNAME -type f | 
    while read file; do 
     touch -m --date="$(stat -c '%y' "$file") + 3600 sec" 
    done 
0

bu deneyin:

find . -type f | while read line; do NEW_TS=`date [email protected]$((\`stat -c '%Y' $line\` + 3600)) '+%Y%m%d%H%M.%S'`; touch -t $NEW_TS ${line}; done 
0

Çok teşekkürler, Chris! Aslında sonunda bir "$ dosya" olmalıdır (tırnak işaretleri ile veya boşluklarla dosya isimlerini yok sayar, neden olmasın), ancak bunun işe yaradığı gözükür.

find $DIRNAME -type f | 
    while read file; do 
     touch -m --date="$(stat -c '%y' "$file") + 3600 sec" "$file" 
    done 
0

Bu sorun -exec zor anlar} {yerinin olmasıdır

find $DIRNAME -type f -exec bash -c 'touch -m --date="$(stat -c %y "$1") + 3600 sec" "$1"' -- {} \; 

yapacak, bazen ve eğer -exec kullanımları + yerine \;'a sadece izin verir. Bu gibi durumlarda bazen "en kolay" şey, bash'ı çağırmak ve her bir sonuca geçmek, yukarıda yaptığım şeydir.

Bu gerçekten, bu durumda, diğer çözümlerin okuma/zaman döngüsünden kaçınmaktır, ancak bazı durumlarda bu önemli bir tekniktir.

+0

filonları epoch saniyedir. Bir DST zaman değişikliği, bir dosyanın gerçek zamanlı olarak mtime, atime veya ctime değerini değiştiremez. Zaman değişikliğini telafi etmek için sistem saatini sıfırladınız mı? –

+0

Orijinal posteri yaklaşımının özgün problemini çözmek için yaklaşımının doğruluğu hakkında yorum yapmıyorum, sadece bu araçları nasıl birleştireceğimi gösteriyorum. – Sorpigal

1

İkinci örneğinizden hata iletisi, xargs -I {} kullanmadı. Önceden değerlendirilmekte olan şeyleri önlemek için, komutu tek tırnak içinde sh'a iletin.

find $DIRNAME -type f -print0 | xargs -0 -I {} sh -c 'touch -m --date="$(stat -c '%y' "{}") + 3600 sec" "{}"' 
0

Orijinal posterim. İpuçları ve açıklamalar için hepinize teşekkür ederim. Sadece bunu neden yaptığımı açıklığa kavuşturmak için. DST değişimi, windows, mac ve linux sistemleri arasında veri aktarımı yapmak için kullandığım ve harici bir sabit diskimi etkiledi ve böylece rsyncimi bozdu. Tüm dosyaların kopyalarını değiştirmek için daha kolay ve hızlı olacağını düşündüm (belki de değil, ama başka bir iş parçacığı için, sanırım)

İlgili konular