unix/linux найти и отсортировать по дате изменения

<p>как я могу сделать простой <code>find</code>, который бы упорядочил результаты по последним измененным?</p><p>вот текущая <code>find</code>, которую я использую (я делаю экранирование shell в php, так что причина для переменных):</p><pre><code>find '$dir' -name '$str'\* -print | head -10 </code></pre><p>как я мог иметь этот порядок поиска по самым последним модифицированным? (обратите внимание, я не хочу, чтобы он сортировал «после» поиска, а скорее находил результаты на основе того, что было недавно изменено.)</p>

<p>использовать этот:</p><pre><code>find . -printf "%t@ %tc %p\n" | sort -n </code></pre><p><code>printf</code> аргументы из <a href="http://unixhelp.ed.ac.uk/cgi/man-cgi?find"><code>man find</code></a> :</p><ul> <li> <p><code>%tk</code>: время последнего изменения файла в формате, указанном <code>k</code>.</p> </li> <li> <p><code>@</code>: секунды с 1 января 1970 года, 00:00 по гринвичу, с дробной частью.</p> </li> <li> <p><code>c</code>: дата и время локали (сб. 4 ноября 12:02:33 est 1989).</p> </li> <li> <p><code>%p</code>: имя файла.</p> </li> </ul>

<p>самый простой способ - использовать zsh благодаря его <a href="http://zsh.sourceforge.net/doc/release/expansion.html#glob-qualifiers">glob qualifiers</a> .</p><pre><code>print -lr -- $dir//$str*(om[1,10]) </code></pre><p>если у вас есть gnu find, заставьте его распечатать время изменения файла и отсортировать по нему.</p><pre><code>find -type f -printf '%t@ %p\0' | sort -zk 1nr | sed -z 's/^[^ ]* //' | tr '\0' '\n' | head -n 10 </code></pre><p>если у вас есть gnu find, но нет других утилит gnu, используйте символы новой строки вместо разделителей; вы потеряете поддержку имен файлов, содержащих переводы строк.</p><pre><code>find -type f -printf '%t@ %p\n' | sort -k 1nr | sed 's/^[^ ]* //' | head -n 10 </code></pre><p>если у вас есть perl (здесь я предполагаю, что в именах файлов нет новых строк):</p><pre><code>find . -type f -print | perl -l -ne ' $_{$\_} = -m; # store file age (mtime - now) end { $,="n"; @sorted = sort {$\_{$a} <=> $\_{$b}} keys %_; # sort by increasing age print @sorted[0..9]; }' если у вас есть python (также предполагается, что в именах файлов нет перевода строки):find . -type f -print | python -c 'import os, sys; times = {} for f in sys.stdin.readlines(): f = f[0:-1]; times[f] = os.stat(f).st_mtime for f in (sorted(times.iterkeys(), key=lambda f:times[f], reverse=true))[:10]: print f' вероятно, есть способ сделать то же самое в php, но я этого не знаю.если вы хотите работать только с инструментами posix, это довольно сложно; см. <a href="https://unix.stackexchange.com/questions/9247/how-to-list-files-sorted-by-modification-date-recursively-no-stat-command-availa">как рекурсивно вывести список файлов, отсортированных по дате изменения (команда stat недоступна!) (повторная установка первых 10 - самая простая часть).

вам не нужно php или python, просто <a href="http://en.wikipedia.org/wiki/ls">ls :man ls: -t sort by modification time -r, reverse order while sorting (--reverse ) -1 list one file per line find /wherever/your/files/hide -type f -exec ls -1rt "{}" +; если команда  завершается со статусом ошибки (то есть<strong> список аргументов слишком длинный </strong>), то вы можете выполнить итерацию с помощью команды find. перефразировано из: <a href="http://www.in-ulm.de/~mascheck/various/argmax/">максимальная длина аргументов для нового процесса  find . -print0|xargs -0 command (оптимизирует скорость, если find не реализует "-exec +", но знает "-print0") find . -print|xargs command (если в аргументах нет пробелов) если основная часть аргументов состоит из длинных, абсолютных или относительных путей, попробуйте переместить ваши действия в каталог: cd /directory/with/long/path; command  и еще одно быстрое решение может состоять в том, чтобы соответствовать меньшему количеству аргументов: command [a-e]; command [f-m]; ...

вам нужно только <a href="http://en.wikipedia.org/wiki/ls">ls вы можете сделать find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;, как указано выше,или жеls -1rt find /wherever/your/file/hides -type f 

расширяя <a href="https://superuser.com/a/546900/141883">ответ пользователя 195696 :find . -type f -printf "%t@t%tc %6k kib %pn" | sort -n | cut -f 2- для каждого файла сначала выводится числовая метка времени (для сортировки с последующим табулированием t), затем читаемая человеком метка времени, затем размер файла (к сожалению, find's -printf не может быть выполнен в мегабайтах, только в кибибайтах), затем имя файла с относительный путь.затем sort -n сортирует его по первому числовому полю.затем cut избавляется от того первого числового поля, которое не представляет интереса для пользователя. (печатает второе поле вперед.) разделителем полей по умолчанию является t или табуляция.пример вывода:thu 06 feb 2014 04:49:14 pm est 64 kib ./057_h2_f7_10/h2_f7_10.class fri 07 feb 2014 02:08:30 am est 7962976 kib ./056_h2_f7_400/h2__rh_4e-4.mph fri 07 feb 2014 02:23:24 am est 7962976 kib ./056_h2_f7_400/h2_f7_400_out_model.mph fri 07 feb 2014 02:23:24 am est 0 kib ./056_h2_f7_400/h2_f7_400_out.mph.status fri 07 feb 2014 02:23:24 am est 64 kib ./056_h2_f7_400/1579678.out fri 07 feb 2014 03:47:31 am est 8132224 kib ./057_h2_f7_10/h2__rh_1e-5.mph fri 07 feb 2014 04:00:49 am est 8132224 kib ./057_h2_f7_10/h2_f7_10_out_model.mph fri 07 feb 2014 04:00:49 am est 0 kib ./057_h2_f7_10/h2_f7_10_out.mph.status fri 07 feb 2014 04:00:49 am est 64 kib ./057_h2_f7_10/1579679.out fri 07 feb 2014 09:47:18 am est 9280 kib ./056_h2_f7_400/h2__rh_4e-4.mat fri 07 feb 2014 10:51:23 am est 9728 kib ./018_bidomain/h2_plain__rh_1e-5.mat fri 07 feb 2014 10:58:33 am est 9568 kib ./057_h2_f7_10/h2__rh_1e-5.mat fri 07 feb 2014 05:05:38 pm est 64 kib ./058_h2_f7_stationary/h2_f7_stationary.java fri 07 feb 2014 06:06:29 pm est 32 kib ./058_h2_f7_stationary/slurm.slurm sat 08 feb 2014 03:42:07 am est 0 kib ./058_h2_f7_stationary/1581061.err sat 08 feb 2014 03:42:14 am est 64 kib ./058_h2_f7_stationary/h2_f7_stationary.class sat 08 feb 2014 03:58:28 am est 70016 kib ./058_h2_f7_stationary/h2s__rh_1e-5.mph sat 08 feb 2014 04:12:40 am est 70304 kib ./058_h2_f7_stationary/h2s__rh_4e-4.mph sat 08 feb 2014 04:12:53 am est 70304 kib ./058_h2_f7_stationary/h2_f7_stationary_out_model.mph sat 08 feb 2014 04:12:53 am est 0 kib ./058_h2_f7_stationary/h2_f7_stationary_out.mph.status sat 08 feb 2014 04:12:53 am est 32 kib ./058_h2_f7_stationary/1581061.out mon 10 feb 2014 11:40:54 am est 224 kib ./058_h2_f7_stationary/h2s__rh_4e-4.mat mon 10 feb 2014 11:42:32 am est 224 kib ./058_h2_f7_stationary/h2s__rh_1e-5.mat mon 10 feb 2014 11:50:08 am est 32 kib ./plot_grid.m я намеренно сделал поле размера файла 6 символов, потому что, если сделать его длиннее, становится трудно визуально различать, насколько большие файлы. таким образом, файлы размером больше 1e6 киб выделяются: на 1 символ - 1-9 гб, на 2 символа - 10-99 гб и т.д.правка: вот еще одна версия (так как find . -printf "%tc" падает на mingw/msys):find . -type f -printf "%t@t%pn" | sort -n | cut -f 2- | xargs -i{} ls -glath --si {} давать вывод как:-rw-r--r-- 1 es 23k jul 10 2010 ./laptop_0000071.jpg -rw-r--r-- 1 es 43m jul 29 19:19 ./work.xcf -rw-r--r-- 1 es 87k jul 29 20:11 ./patent_lamps/us patent 274427 maxim lamp holder.jpg -rw-r--r-- 1 es 151k jul 29 20:12 ./patent_lamps/edison screw-in socket.png -rw-r--r-- 1 es 50k jul 29 20:13 ./patent_lamps/1157 lamp.jpg -rw-r--r-- 1 es 38k jul 29 20:14 ./patent_lamps/us06919684-20050719-d00001.png куда:  -i{} приводит к тому, что вхождение {} заменяется аргументом,<strong> и </strong>newlines теперь являются разделителями аргументов (обратите внимание на пробелы в именах файлов выше).   ls -g подавляет печать имени группы (пустое пространство).   ls -h --si производит удобочитаемые размеры файлов (более корректно с --si).   ls -t сортирует по времени, что здесь неактуально, но это то, что я обычно использую.  

вариант os x ответа @ user195696:  с отметкой времени: find . -type f -exec stat -f "%sm %n" -t "%y%y%m%d%h%m" {} ; | sort -r   без отметки времени: find . -type f -exec stat -f "%sm %n" -t "%y%y%m%d%h%m" {} ; | sort -r | awk -f' ' '{ print substr($0, length($1) + 2) }'  

пытаться:find '$dir' -name '$str' -print | xargs ls -tl | head -10 но также полезно фильтровать данные по -mmin/-mtime и -type.

если ваш выбор find очень прост, вы можете обойтись без него и просто использовать ls:ls -1 .cc # -r -t optional 

я обнаружил, что это делает работу на mac os x (и достаточно общей, чтобы работать на других unixen):find . -type f -ls | awk '{print $(nf-3), $(nf-2), $(nf-1), $nf}' | sort 

использование:find . -type f -mtime 0 -printf "[%td %ti:%tm%tp] %s %pn" | sort -n | awk '{ hum[10244]="tb"; hum[10243]="gb"; hum[10242]="mb"; hum[1024]="kb"; hum[0]="b"; for (x=10244; x>=1024; x/=1024){ if ($3>=x) { printf $1" "$2"\t%7.2f %s\t%s\n",$3/x,hum[x],$4;break } }}'; </code></pre><p>эта команда отсортирует файлы по дате изменения.</p><p>и отображать как:</p><pre><code>[12/05/13 03:10pm] 1.75 mb ./file.text [12/06/13 11:52pm] 2.90 mb ./file2.mp4 [12/07/13 04:11pm] 4.88 mb ./file3.mp4 [12/07/13 09:17pm] 4.74 mb ./test.apk </code></pre>

<p>я не думаю, что <code>find</code> имеет какие-либо параметры для изменения порядка вывода. <code>-mtime</code> и <code>-mmin</code> позволят вам ограничить результаты файлами, которые были изменены в течение определенного промежутка времени, но выходные данные не будут отсортированы - вам придется сделать это самостоятельно. gnu <code>find</code> имеет параметр <code>-printf</code>, который, помимо прочего, позволит вам печатать время модификации каждого найденного файла (строки формата <code>%t</code> или <code>%tk</code>); это может помочь вам отсортировать вывод <code>find</code> так, как вы хотите.</p>

<p>я улучшил ответ akashs, сделав скрипт, корректно обрабатывающий пробелы в именах файлов:</p><pre><code>find . -type f -mtime 0 -printf ";[%td %ti:%tm%tp];%s;%p\n" | sort -n | awk -f ";" '{ hum[1024**4]="tb"; hum[1024**3]="gb"; hum[1024**2]="mb"; hum[1024]="kb"; hum[0]="b"; for (x=1024**4; x>=1024; x/=1024){ if ($3>=x) { printf $1" "$2"t%7.2f %st%sn",$3/x,hum[x],$4;break } }}'; 

вы можете использовать stat в bsd и linux (не в posix) следующим образом:$ stat -f "%m%t%n" /[the dir]/* | sort -rn | cut -f2- </code></pre><p>если вы хотите ограничить количество:</p><pre><code>$ stat -f "%m%t%n" /[the dir]/ | sort -rn | head -[the number] | cut -f2- 

если вы хотите заказать все файлы png по времени в $pwd</code>:</p><p>этот простой однострочник дает всю гибкость регулярного выражения для <code>find</code> и <code>ls</code>.</p><pre><code>find $pwd -name "*.png" -print0 | xargs -0 ls -laht | less </code></pre>