Скрипт оболочки Unix: обновлять временную метку во всех подкаталогах и подфайлах, в том числе с пробелами - PullRequest
2 голосов
/ 15 сентября 2010

Вот то, чего я пытаюсь достичь.

У меня есть каталог с более чем 4200 подфайлами / подкаталогами, каждый из которых должен быть установлен на определенную метку времени.

Это проблема, потому что у многих из них есть пробелы и другие странные символы.

Первое, что я попробовал:

touch $(find .)

Не будет работать из-за пробелов.Он обновит метки времени для всех файлов и каталогов, которые свободны от места, но те, которые не имеют, не получат новую метку времени.Кроме того, как и следовало ожидать, он создает файлы в корневом каталоге, соответствующие элементам имен файлов с пробелами.Поэтому, если у меня есть файл с именем «One Two Three», «touch» создает 3 файла: «One», «Two» и «Three» в корневом каталоге.Само по себе это можно исправить, используя -c с «touch», но, конечно, он все равно не обновит файл с пробелом.

Второе, что я попробовал, было:

for FILENAME in $(find .); do touch -t 201007162310.00 "$FILENAME"; done

Но это та же история.

Я нашел пару результатов в Интернете, но все они пытаются достичь чего-то по-другому и поэтому предлагают способы, которые не будут работать для меня.

Так что теперь я потерян.Любые идеи?

Неужели нельзя заставить команду 'find' добавлять и добавлять каждую строку в кавычках или что-то в этом роде?

EDIT: Это необходимо сделать с помощью сценария оболочки.Использование Perl, PHP или любой другой среды не поможет.Я мог бы легко сделать это с помощью чего угодно, кроме сценариев оболочки Unix, но это должен быть сценарий оболочки Unix, желательно не большой.

Ответы [ 4 ]

11 голосов
/ 15 сентября 2010
find . -exec touch -t 201007162310.00 {} +

Это самый простой и надежный способ сделать то, что вы хотите.

5 голосов
/ 15 сентября 2010

find и xargs могут быть установлены для связи с использованием строк с нулевым символом в конце, поэтому вы можете сделать

find . -print0 | xargs -0 touch

Это не будет делать то, что вы хотите, так как будет несколько вызововtouch вызывая разное время.Поэтому вы можете использовать другой файл в качестве эталонной отметки времени

touch /tmp/ref
find. -print0 | xargs -0 touch -r /tmp/ref
1 голос
/ 15 сентября 2010

Пара опций:

  • Использование read, например find . | while read x; do touch $x; done
  • Использование xargs, например find . -print0 | xargs -0 touch
0 голосов
/ 15 сентября 2010

Если вы делаете

ls -b

-b приведет к тому, что имя файла будет напечатано с escape-символом "\" перед пробелом.

Обновление: Я пробовал это

find . | ls -b | xargs touch

и, похоже, это сработало для моего маленького теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...