Как найти новейшие файлы в каталоге, включая подкаталоги?

12

Я ищу способ в Windows перечислить все файлы в данном каталоге и его подкаталогах, отсортированные так, чтобы самые новые файлы были сверху. Есть ли простой способ сделать это? Я также согласился бы на сценарий Perl.

койка
источник

Ответы:

3

Если вы все еще заинтересованы в решении на основе сценариев, я быстро скомбинировал что-то, что будет отображать файлы из всех каталогов вместе:

#!C:/Perl/bin/perl.exe
use File::Find;

my %files = ();

sub process
{
    $files{$_} = (stat($_))[9] unless -d $_;
}

find (\&process, $ARGV[0]);

foreach my $key(sort {$files{$b} <=> $files{$a}} keys %files)
{
    print "$key\n";
}

Файлы отображаются от самых новых до самых старых, показывая только имя файла. Таким образом, вы можете легко передать вывод этого скрипта другому инструменту для обработки, не беспокоясь о лишнем выводе.

Использование: perl find.pl <starting_directory>

Джон Т
источник
Благодарю. я думаю, что это должен был быть вопрос переполнения стека, если бы он шел в этом направлении. :)
Kip
1
несколько изменений, которые я сделал (для помощи любому, кто случайно сталкивался с этим): my $dir = ($#ARGV >= 0 ? $ARGV[0] : '.');чтобы он сканировал текущий каталог, если не задан параметр каталога, и включал время, которое выводится:print strftime('%Y-%m-%d %H:%M:%S', localtime((stat($key))[9])) . " $key\n";
Kip
1
@Kip, mtime должно быть сохранено, $files{$key}если вы хотите использовать это strftimeпри печати, чтобы избежать повторного вызова stat(). Если вы планируете передать его в другую программу, я также изменил его, чтобы отобразить полный путь к именам файлов. Вы можете получить это здесь: pastebin.ca/1797748
Джон Т
спасибо, ты быстрее чем я Команда stat работала только для файлов в текущем каталоге, так как вы сохраняли только последнюю часть имени файла.
Кип
7

Как это: dir /s /o:-d

SLaks
источник
1
хм ... не совсем идеально, это все еще перечисляет каждый каталог в отдельности, но я могу работать с ним
Кип
5

Если у вас установлен Cygwin или аналогичный, то find . -type f | xargs ls -trсработает. Вы почти наверняка можете сделать то же самое с PowerShell от Microsoft.

Дэвид Спиллетт
источник
3

Если вы используете Все , просто введите путь и отсортируйте по дате изменения, и вы получите все файлы в этой папке в указанном порядке, независимо от подкаталога.

Все бесплатно, портативная версия доступна.


источник
1

Если вы не возражаете против кодирования (хотя это ставит вопрос на территорию переполнения стека), то в C # есть классы Directoryand File.

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

Там также DirectoryInfoи FileInfoклассы.

Я должен был добавить, что все эти функции доступны через Powershell , поэтому у вас нет доступа к полной IDE.

ChrisF
источник
Благодарю. Я разработчик, хотя в основном в Java. я спрашивал здесь, надеясь, что опция оболочки была доступна
Кип
@Kip - я понял вчера вечером после того, как вышел из системы, что я должен был упомянуть Powershell - technet.microsoft.com/en-us/scriptcenter/dd742419.aspx - это язык сценариев, но у вас есть доступ к среде выполнения .NET.
ChrisF
1

Если у вас установлено что-то вроде Git Bash или Cygwin, вы сможете использовать один из ответов здесь: /programming/4561895/how-to-recursively-find-the-latest-modified -file-в-каталог

Тот, который работал хорошо для меня: find . -type f -printf '%TF %TT %p\n' | sort -r

Вы также можете добавить | head -10к концу этого, чтобы увидеть только 10 самых последних, скажем.

peterflynn
источник