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: cannot stat `{}': No such file or directory

もう半日、この壁に頭をぶつけています。なにか提案を?

4

6 に答える 6

1
find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec"
    done
于 2010-11-18T13:12:32.807 に答える
1

2 番目の例のエラー メッセージは、 を使用しなかったためですxargs -I {}。時期尚早に評価されることを避けるために、コマンドをsh単一引用符で囲みます。

find $DIRNAME -type f -print0 | xargs -0 -I {} sh -c 'touch -m --date="$(stat -c '%y' "{}") + 3600 sec" "{}"'
于 2010-11-18T20:39:05.157 に答える
0

私はオリジナルのポスターです。ヒントと説明をありがとうございました。私がこれをしている理由を明確にするためだけに。DSTの変更は、Windows、Mac、およびLinuxシステム間でデータを転送するために使用するFAT外付けハードドライブに影響を与えたため、rsyncを台無しにしました。すべてをコピーするよりも、すべてのファイルの時間を変更する方が簡単で速いと思いました(おそらくそうではありませんが、それは別のスレッド用だと思います)

于 2010-11-21T15:37:15.547 に答える
0

これを試して:

find . -type f | while read line; do NEW_TS=`date -d@$((\`stat -c '%Y' $line\` + 3600 )) '+%Y%m%d%H%M.%S'`; touch -t $NEW_TS ${line}; done
于 2010-11-18T13:57:44.450 に答える
0

どうもありがとう、クリス!実際には最後に「$file」が必要です(引用符を付けるか、スペースを含むファイル名を無視しますが、理由はわかりません)が、それ以外は機能しているようです。

find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec" "$file"
    done
于 2010-11-18T14:01:58.767 に答える
0

これでできます

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

問題は、-exec が {} を見つけるのに苦労する場合があり、-exec が \ の代わりに + を使用している場合です。一度だけ許可します。このような場合、「最も簡単な」方法は、bash を呼び出して各結果を渡すことです。これは、上記で行っていることです。

この場合、これが実際に達成するのは、他のソリューションの read/while ループを回避することだけですが、場合によっては、これが不可欠な手法になります。

于 2010-11-18T18:24:44.247 に答える