Как мне собрать поиск, статистику и сенсорный? - PullRequest
0 голосов
/ 18 ноября 2010

Я пытаюсь увеличить временную метку всех файлов в дереве каталогов на один час (чтобы исправить изменения 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: not stat `{} ': нет такого файла или каталога

Я бьюсь головой об эту стену уже полдня. Любое предложение?

Ответы [ 6 ]

1 голос
/ 18 ноября 2010

Сообщение об ошибке из вашего второго примера было связано с тем, что вы не использовали xargs -I {}.Чтобы избежать преждевременной оценки, передайте команду sh в одинарных кавычках.

find $DIRNAME -type f -print0 | xargs -0 -I {} sh -c 'touch -m --date="$(stat -c '%y' "{}") + 3600 sec" "{}"'
1 голос
/ 18 ноября 2010
find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec"
    done
0 голосов
/ 21 ноября 2010

Я оригинальный постер. Спасибо всем за советы и объяснения. Просто чтобы уточнить, почему я это делаю. Изменение DST повлияло на внешний жесткий диск FAT, который я использую для передачи данных между системами Windows, Mac и Linux, и поэтому испортил мой rsync. Я думал, что будет проще и быстрее изменить время всех файлов, чем копировать все (возможно, нет, но это для другого потока, я думаю)

0 голосов
/ 18 ноября 2010

Это будет сделано

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

Проблема в том, что -exec иногда бывает трудно найти {}, и если ваш -exec использует + вместо \;это позволяет только один раз .В подобных случаях иногда «проще всего» вызывать bash и передавать каждый результат, что я и делаю выше.

В этом случае все, что действительно выполняется, - это избежать цикла чтения / выполнениядругих решений, но в некоторых случаях это важная техника.

0 голосов
/ 18 ноября 2010

Большое спасибо, Крис! На самом деле в конце должен быть "$ file" (с кавычками, иначе он будет игнорировать имена файлов с пробелами, не знаю почему), но в остальном он работает.

find $DIRNAME -type f |
    while read file; do
        touch -m --date="$(stat -c '%y' "$file") + 3600 sec" "$file"
    done
0 голосов
/ 18 ноября 2010

Попробуйте это:

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
...