Мне было интересно, если кто-нибудь знает, как рекурсивно изменять временные метки папок на основе последней найденной метки времени файлов в этой папке.
Так, например:
jon @ UbuntuPanther: / media / media / MP3s / Foo Fighters / (1997-05-20) Цвет и форма $ ls -alF всего 55220 drwxr-xr-x 2 Джон Джон 4096 2010-08-30 12:34 ./ drwxr-xr-x 11 Джон Джон 4096 2010-08-30 12:34 ../ -rw-r - r-- 1 Джон Джон 1694044 2010-04-18 00:51 Foo Fighters - Doll.mp3 -rw-r - r-- 1 Джон Джон 3151170 2010-04-18 00:51 Foo Fighters - Достаточно Space.mp3 -rw-r - r-- 1 Джон Джон 5004289 2010-04-18 00:52 Foo Fighters - Everlong.mp3 -rw-r - r-- 1 Джон Джон 5803125 2010-04-18 00:51 Foo Fighters - Февраль Stars.mp3 -rw-r - r-- 1 Джон Джон 4994903 2010-04-18 00:51 Foo Fighters - Привет, Джонни Парк! .mp3 -rw-r - r-- 1 Джон Джон 4649556 2010-04-18 00:52 Foo Fighters - Обезьяна Wrench.mp3 -rw-r - r-- 1 Джон Джон 5216923 2010-04-18 00:51 Foo Fighters - My Hero.mp3 -rw-r - r-- 1 Джон Джон 4294291 2010-04-18 00:52 Foo Fighters - My Poor Brain.mp3 -rw-r - r-- 1 Джон Джон 6778011 2010-04-18 00:52 Foo Fighters - New Way Home.mp3 -rw-r - r-- 1 Джон Джон 2956287 2010-04-18 00:51 Foo Fighters - Увидимся.mp3 -rw-r - r-- 1 Джон Джон 2730072 2010-04-18 00:51 Foo Fighters - Up в Arms.mp3 -rw-r - r-- 1 Джон Джон 6086821 2010-04-18 00:51 Foo Fighters - Идем за тобой.mp3 -rw-r - r-- 1 Джон Джон 3033660 2010-04-18 00:52 Foo Fighters - Wind Up.mp3
В папке «(1997-05-20)« Цвет и форма »отметка времени будет иметь значение 2010-04-18 00:52.
источник
/media/media/MP3s
? Тогда в Zsh:for d in /media/media/MP3s/**/*(/); do touch -r $d/*(Dom[1]) $d; done
. Без zsh (но на самом деле используйте zsh, это проще): поместите команду в скрипт и запуститеfind /media/media/MP3s -type d -execdir /path/to/the/script \;
.for d in ...
как вы можете адаптировать следующее, чтобы оно также работало с папками, которые содержат пробелы? (это все еще отсутствует в моем решении)Это не «рекурсивно», это просто изменение всех временных меток в папке. Если это то, что вы имеете в виду, есть два шага.
stat -c '%Y' filename
выведет метку времениfilename
иstat -c '%Y %n' *
выведет метку времени и имя файла для каждого файла в папке, так что будет найдено имя файла последнего измененного файла в текущей папке:Если подумать, есть способ проще получить максимальную отметку времени в папке:
Затем вы хотите изменить все файлы в папке, чтобы иметь ту же метку времени, что и этот файл.
touch -r foo bar
изменится,bar
чтобы иметь такую же измененную временную метку, какfoo
, поэтому это изменит все файлы в папке, чтобы иметь ту же измененную временную метку, что и ваш последний измененный файл:Итак, однострочник это:
источник
ls
искажает имена файлов, содержащие не-ASCII символы. Если ты хочешь однострочника, используй zsh :-)Я собрал работу вместе и теперь:
Это будет скрипт, который изменяет все каталоги внутри
/tmp/test/
на временную метку самого нового файла внутри каждого каталога:Вы можете добавить несколько тестовых файлов в / tmp следующим образом:
источник
"
снова, сначала оно выглядит, как будто отсутствует, но работает.просто используйте
источник
Я использую этот скрипт, чтобы рекурсивно устанавливать метки времени папок для последнего содержимого. (Это очень похоже на ответ Жиля):
источник
Я взял команду @Gilles zsh и улучшил ее работу в подпапках, но кажется, что zsh ужасно неэффективен для части ** / * (FDod).
Кавычки позволяют правильно работать с записями каталога, содержащими пробелы и табуляции. FD заставляет его находить непустые каталоги, в том числе начинающиеся с. Od заставляет его искать в глубину , чтобы метки времени родительской папки корректно обновлялись.
При тестировании я заметил, что производительность и объем памяти для ** / * (FDod) были безумными (более 1,4 ГБ для всего 650 тыс. Папок), и он полностью прочитал перед тем, как начать трогать папки. После замены на поиск / чтение он стал намного быстрее, не сжег память и начал почти сразу.
Если вы не запускаете его в скрипте, замените «$ @» на те папки, из которых вы хотите его запустить.
источник
Мне не очень понравилась незаметность команд оболочки, и я быстро сделал это на python.
Он рекурсивно устанавливает все каталоги mtimes в новейший неисключенный файл / dir mtime внутри.
источник