Сортировка каталогов последней измененной датой/временем одноименного содержавшего файла

В zsh, при подсказке ввести print, и затем Alt-H.

Если это дает Вам страницу справочника для print системная команда вместо print встроенный, можно хотеть следовать инструкциям, данным при Доступе к Справке Онлайн в:

info zsh Utilities

Для zsh документация, я предпочитаю использовать info в целом. zsh документация правильно индексируется, и очень легко найти использование документации info.

Например, найти документацию для print, ввести info zsh, и в info, тип i для перевода в рабочее состояние индексной подсказки и типа print (можно добавить несколько Вкладок для получения списка завершения). Или просто выполненный

info zsh print

Открыть zsh информационную книгу и перейти непосредственно к print элемент индекса.

4
24.10.2014, 19:27
4 ответа

Как предложила Вивиан, вариант -t в ls говорит ему сортировать файлы по времени модификации. (последняя первая, по умолчанию; перевернута, если добавить -r).  Это наиболее часто используется (по крайней мере, по моему опыту) для сортировки файлов в каталоге, но его также можно применить к списку файлов в командной строке.  А подстановочные знаки ("глобусы") создают список файлов в командной строке.  Таким образом, если вы скажете

ls -t */file.php

он составит список

domain3/file.php  domain4/file.php  domain2/file.php  domain1/file.php

Но вы добавите опцию -1 (тире один), или впишите это во что-нибудь, он будет перечислять их по одному на каждую строку.  Итак, команда, которую вы хотите, это

ls -t */file.php | sed 's|/file.php||'

Это обычная s/old_string/replacement_string/ substitution in sed, но используя | в качестве разделителя, потому что old_string содержит /, и с пустой replace_string.  (Т.е. удаляется имя файла и / перед ним - /file.php -. от выхода ls .).  Конечно, если вы хотите, чтобы трейлинг / на имена каталогов, просто сделайте sed 's|file.php||' или sed 's/file.php//'.

При желании добавьте опцию -l (нижний регистр L) к ls. чтобы получить длинный список, включая дату/время модификации.  И тогда, возможно, вы захотите усилить команду sed. для удаления несущественной информации (такой как режим, владелец и размер файла). и, если хотите, переместите дату/время после имени каталога.

Это изучит директории, которые являются в текущей директории, и только их.  (Похоже, что это и есть тот вопрос).  Выполнение одноуровневого сканирования некоторого другого каталога является тривиальным вариантом:

ls -t /path/to/tld/*/file.php | sed 's|/file.php||'

To (рекурсивно) выполнить поиск по всему дереву каталогов под вашим текущим каталогом. (или какой-нибудь другой каталог верхнего уровня) немного сложнее.  Введите команду

shopt -s globstar

и затем замените звездочку (*) в одной из вышеприведенных команд на две звездочки (**), например,

ls -t **/file.php | sed 's|/file.php||'
5
27.01.2020, 20:51

Проверьте pie tee standard input to pipes ») из morutils . Это в основном эквивалентно команде Marco tee , но немного проще в вводе.

$ echo foo | pee md5sum sha256sum
d3b07384d113edec49eaa6238ad5ff00  -
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  -
$ pee md5sum sha256sum <foo.iso
f109ffd6612e36e0fc1597eda65e9cf0  -
469a38cb785f8d47a0f85f968feff0be1d6f9398e353496ff7aa9055725bc63e  -
-121--17801-

Да, это вполне возможно.

Это даст вам файлы, которые были изменены за последние 60 минут:

$ find /domain -type f -mmin -60

или это даст вам файлы, которые были отсортированы по времени изменения.

$ find /domain -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

Edit # 1

Если у вас есть расширения файлов, как вы сказали «.php», добавьте следующее:

-name '*.php'

И я нашел это , вы можете его увидеть.

Edit # 2

Ну, ваша последняя правка усложняется. Но вы можете использовать ls -t для последнего изменения каталогов, и если вы хотите сортировать по времени ls -clRt вы можете использовать его и после этого вы можете проверить файлы, но я не уверен, что вы хотите возможно с помощью какой-либо конкретной команды. Это возможно с похожим сценарием (Bash или Perl).

-121--83310-

Это делает почти все, что нужно, за исключением того, что оно оставляет имена каталогов в конце/в конце.

find . -maxdepth 2 -name file1.php -printf '%T@ %h (last modified %Td/%Tm/%TY %Tk:%TM)\n' \
| sort -k 1n | sed 's/^[^ ]* .\///'

Кредит, в котором должен быть кредит. Он адаптирован из shlck ответа здесь .

Изменить: все мои% A должны были быть% T

1
27.01.2020, 20:51

Да, это вполне возможно.

Это даст вам файлы, которые были изменены за последние 60 минут:

$ find /domain -type f -mmin -60

или это даст вам файлы, которые отсортированы по времени изменения.

$ find /domain -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

Правка #1

Если у вас есть расширения файлов, как вы сказали '.php', добавьте это:

-name '*.php'

И я нашел это, возможно, вы захотите это увидеть.

Редактирование #2

Ну, ваше последнее редактирование усложняет дело. Но вы можете использовать ls -t для последней модификации каталогов, и если вы хотите сортировать по времени ls -clRt, вы можете использовать его, а после этого вы можете проверять файлы, но я не уверен, что то, что вы хотите, возможно с помощью какой-либо конкретной команды. Это возможно с помощью похожего скрипта (Bash или Perl).

1
27.01.2020, 20:51

С помощью zsh:

setopt extendedglob
print -rl -- **/file.php(.om:h)

.om сортирует выбранные файлы по mtime и :h удаляет компонент трафика трейлинга.
Если вы также хотите перечислить mtimes, вы можете использовать zstat:

zmodload zsh/stat
for f (**/file.php(.om))
printf '%s %s\t%s\n' $(zstat -F '%d-%b-%Y %T' +mtime -- $f) ${f:h}
0
27.01.2020, 20:51

Теги

Похожие вопросы