Как мне рекурсивно перечислять файлы в каталоге в порядке их создания? - PullRequest
0 голосов
/ 21 января 2012

Я хочу перечислить все файлы, а не каталоги, в том порядке, в котором они были созданы.Я попытался:

ls -R

, который получает все файлы с некоторым раздражающим форматированием, которые я предпочел бы построчно.Тем не менее, мой * nix-foo довольно слаб, и я не уверен, как упорядочить по дате создания.

В конечном итоге это будет сделано в скрипте Ruby, поэтому, если это невозможно с помощью магической команды bash,Ruby-код в порядке;Я просто подумал, что было бы интересно и, возможно, чище использовать bash.

Ответы [ 4 ]

1 голос
/ 21 января 2012

К сожалению, Linux не хранит дату создания. Mac OS поддерживает, но не в портативном, легко читаемом формате. Windows - единственная система, которая хранит ее, но в Ruby нет встроенных команд, позволяющих получить к ней доступ.

Внимательное прочтение ctime в Ruby, которое часто неправильно читается, показывает, что оно поддерживает только время «изменения». Вот документы для ctime от File и File::Stat:

Возвращает время изменения файла (то есть каталог времени информация о файле была изменена, а не сам файл).

1 голос
/ 21 января 2012

Для этой цели я обычно использую

find . -type f -print0 | xargs -0 ls -ltrh

Вы можете предоставить ls все необходимые аргументы форматирования.

Смотри также: http://en.wikipedia.org/wiki/Xargs

1 голос
/ 21 января 2012
Dir['**/*'].reject { |f| File.directory?(f) }.sort_by { |f| File.ctime(f) }
0 голосов
/ 21 января 2012

GNU find может помочь вам, попробуйте сначала

 find . -type f -printf "%C+\t%M\t%p\n" | sed 's/+/ /' | sort -t" " +0 -1

Это может работать.

Но я использую

find (GNU findutils) 4.4.2

И я не смогзаставить работать %C+ штуковину.

Итак, я пришел с длинной строкой в ​​формате printf, которая, как дополнительное преимущество, не требует последующей обработки sed.

find .  -type f -printf '%CY-%Cm-%Cd.%CH%CM%CS\t%M\t%p\n'  | sort +0 -1n

, который дает вывод, такой как

2011-03-30.141038.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-22011-03-30.140959.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.libs/reader3.exe
2011-03-30.141001.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.libs/reader3_ltshwrapper
2011-03-30.141001.0000000000    -rwxr-xr-x      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/reader3.exe
2011-03-30.141002.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/.deps/tree2.Po
2011-03-30.141002.0000000000    -rw-r--r--      ./pkgs/libxml2/libxml2-2.7.7/doc/examples/tree2.o

Трейлинг .0000000000 на каждой отметке времени составляет доли секунды, которые, очевидно, моя система не записывает.Вы можете получить форматирование HH: MM: SS, используя %TX.

Если вам нужны дополнительные поля в вашем списке файлов (я добавил разрешения как дополнительный), выполните man find, а затем выполните поиск -printf.Существует множество аргументов для форматирования списка практически любым нужным вам способом.

Хочу заметить, что вы говорите «хотите, чтобы они были созданы».Unix имеет три метки времени, которые он хранит для файлов, которые не включают время создания, поэтому вы можете использовать отображаемую информацию как

%A  File's  last  access time
%C  File's  last  status change time
%T  File's last modification time

Люди часто думают, что% C должен означать время создания, но, как вы видитеКроме того, это «статус изменение время», что, я думаю, является последним изменением любых прав доступа к файлам.Так что в некоторых случаях это будет время создания файла, но это не гарантировано.(sp).

На странице руководства не указано, что поскольку Windows хранит время создания, вы можете получить его с помощью find.Кто-нибудь?

Надеюсь, это поможет.

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