2010-11-18 7 views
0

ディレクトリツリー内のすべてのファイルのタイムスタンプを1時間増やそうとしています(DSTの変更を修正するため)。たくさんの手直しと検索の後、私はfind、stat、touchでそれを行う方法を考え出しましたが、私はすべてを1つのコマンドにまとめて失敗します。私はどのように一緒に見つけて、統計とタッチを合わせますか?

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

または代替的に使用して引数: コマンドはない

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

しかし、それは動作しないと、エラーを返し: STATは: '} { `を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

どうもありがとう、クリス! 実際には、 "$ file"が最後にあるはずです(引用符で囲むか、スペースを含むファイル名を無視しますが、理由は分かりません)。

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を呼び出してそれを各結果に渡すことです。これは私が上でやっていることです。

これは、他のソリューションのread/whileループを避けることですが、これは必須のテクニックです。

+0

filetimesはエポック秒です。 DST時間の変更は、実際にファイルのmtime、atime、またはctimeを変更することはできません。時間の変化を補うためにシステム時間をリセットしましたか? –

+0

元のポスターのアプローチの正しさについては言及していませんが、私はこれらのツールをどのように組み合わせるかを実証しています。 – Sorpigal

1

2番目の例のエラーメッセージは、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を台無しにしました。私は、すべてのファイルをコピーするよりも、すべてのファイルのatimeを変更するほうが簡単で速いと思っていました(それは別のスレッド用ですが)。

関連する問題