2010-11-18 31 views
0

我正在嘗試將目錄樹中所有文件的時間戳增加一個小時(以糾正DST更改)。經過大量的修補和搜索後,我已經找到了如何使用find,stat和touch來完成它,但是當我將所有內容放在一個命令中時,它就會失敗。 命令是:我該如何拼湊找到,統計和觸摸?

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

或可替代地使用ARGS:

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

但是它不工作並返回一個錯誤: 統計:不能STAT`{}':沒有這樣的文件或目錄

我一直在這堵牆上撞了我半天的頭。任何建議?

回答

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

試試這個:

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

非常感謝,克里斯! 實際上最後應該有一個「$文件」(引號或它會忽略帶空格的文件名,不知道爲什麼),但除此之外它似乎工作。

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

這將做到這一點

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

的問題是,-exec也很難定位{},有時,如果你的-exec使用+而不是\;它只允許它一次。在這種情況下,「最簡單」的事情是調用bash並傳遞每個結果,這正是我上面所做的。

所有這些在這種情況下真正完成的是避免其他解決方案的讀取/ while循環,但在某些情況下,這是一項基本技術。

+0

文件時間是紀元秒。 DST時間更改實際上不能改變文件的mtime,atime或ctime。您是否重置系統時間以補償時間變化? – 2010-11-19 01:38:31

+0

我不評論原始海報的方法對解決他原來的問題的正確性,我只是展示如何組合這些工具。 – Sorpigal 2010-11-19 13:33:55

1

第二個示例中的錯誤消息是因爲您沒有使用xargs -I {}。爲了避免過早評估事件,請將命令傳遞到單引號中的sh

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

我是原來的海報。謝謝大家的提示和解釋。 只是爲了澄清我爲什麼這樣做。 DST更改影響了我用於在Windows,Mac和Linux系統之間傳輸數據的FAT外部硬盤驅動器,因此搞砸了我的rsync。我認爲改變所有文件的時間比複製所有文件要容易和快速(可能不是,但是這是另一個線程,我猜)