Отсортируйте вывод находки - должностное лицо ls

Мой опыт показал, что большинство раз безопасно изменить разделы NTFS с помощью ntfs-3g драйвера FUSE.

Но если Вы используете его много или если компьютер зависает/получает перезагруженный сильно, в то время как существует IO на разделе NTFS, Вы могли бы попасть в беду (например, ошибки IO при попытке получить доступ к файлам)

Так, для завершения:

  • Если Вы просто монтируете его перезаписываемый, чтобы изменить некоторые определенные файлы и затем повторно смонтировать его в ro режиме, необходимо быть в порядке.
  • Но если ntfs-файловая-система часто используется, Вам, возможно, понадобилась бы установка окон для устранения проблем файловой системы (который в этом случае невозможен, поскольку Вы не используете реальный раздел),
14
04.07.2014, 02:26
5 ответов

Я предполагаю, что имена ваших файлов не содержат символов новой строки.

find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10

Использование + вместо ; для завершения действия -exec ускоряет его за счет пакетных вызовов ls . Вы можете сортировать по конвейеру с помощью команды sort ; скажите ему начать сортировку с 10-го поля (первые 9 - это метаданные: блоки, разрешения, количество ссылок, пользователь, группа, размер и 3 поля даты / времени). Параметр -n указывает ls использовать числовые значения для пользователя и группы, что позволяет избежать риска того, что имена пользователей или групп будут содержать пробелы.

В качестве альтернативы, с zsh вы можете обойтись без каких-либо предположений о каком-либо имени, используя квалификаторы glob для сбора и сортировки файлов и zargs для запуска ls ] несколько раз, если командная строка будет слишком длинной. Вам действительно нужен GNU ls (в частности, его опция -f ), чтобы избежать повторной сортировки с помощью ls (другой подход - эмуляция ls ] с помощью zsh zstat ).

autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf
14
27.01.2020, 19:51
ls -l $(find /home/setefgge/public_html -type f -ctime -1 | sort)
-1
27.01.2020, 19:51

POSIX должен сказать это о датах в ls -long листинг:

Поле <дата и время> должно содержать соответствующую дату и метку времени, когда файл был последний раз изменен. В локали POSIX поле должно быть эквивалентно выводу следующей команды даты:

date "+%b %e %H:%M"

.... если файл был изменен в течение последних шести месяцев, или:

date "+%b %e %Y"

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

d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"

###OUTPUT###
Jul  5 Jul  4

grep для этого и вы вернете только те строки, которые содержат строки, представляющие либо сегодняшнюю, либо вчерашнюю дату. Следующая команда немного добавляет к этому:

ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

ls опции состоят из:

  1. -a возвращают все файлы в каталоге - включая те, которые начинаются с . dot
  2. -l long listing
  3. -R recursively list all child directory
  4. -c display time modification instead instead access time
  5. -q return the shell glob ? вместо непечатаемых или \tab символов в имени файла

Эти результаты передаются через файл |pipe в sed, который совпадает только с файлом sed:

  1. Пустая строка перед именем файла и следующая строка
  2. Строки, начинающиеся с - (другими словами - не d для каталога), которые также содержат вашу дату -.
  3. Он не печатает строки с именами, хотя если только каталог, в котором они названы, на самом деле не содержит файлы, для которых Вы отфильтровали.

Вывод выглядит следующим образом:

ls -alRcq --color=always | 
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv   2086 Jul  4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv   2657 Jul  4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv    681 Jul  5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul  5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul  4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul  4 13:34 shot-2014-06-22_17-11-06.jpg

./.cache/efreet:
-rw------- 1 mikeserv mikeserv  37325 Jul  4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv  37325 Jul  4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  16037 Jul  4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv   3117 Jul  4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul  4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv  18589 Jul  4 23:30 icons_hicolor_localhost.eet

./.config:
-rw-r--r-- 1 mikeserv mikeserv   30 Jul  4 19:10 pavucontrol.ini

./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul  4 13:36 conf.tar.lz4.bak

Да, он даже работает с LS_COLORS - что, вероятно, является низким приоритетом для Вашего cron, конечно, но, эй, Ваши опции открыты.

В любом случае, это дает некоторые существенные преимущества по сравнению с некоторыми другими возможными вариантами.

  1. В первую очередь find + ls включает в себя несколько вызовов - это только один процесс ls, и поэтому он способен надежно сортировать все - что он делает по умолчанию - и поэтому сортировка также является вспомогательным процессом.

  2. Любое решение, связанное с найти и сортировку и ls, в общем-то, делает все работы дважды. ls и find оба разрешают каждый путь и stat каждый файл. ls и сортировка отсортируют все результаты. Вместо этого, наверное, лучше всего использовать единственную ls.

  3. Затем, конечно, есть дата и sed часть этого ответа. Важно отметить, что сначала вы делаете сложную часть и получаете регекс - и только один раз - а потом только подрезаете один список результатов, а не говорите, получаете результаты, сортируете и сортируете.

  4. Это не разбивается на имена файлов, содержащих новые строки, как это, скорее всего, будет сделано в других решениях. У этого решения есть свои предостережения, которые я объясню далее, но они незначительны и с ними легко справиться. На мой взгляд, это самое надежное решение.

Есть два случая, когда вышеуказанная команда может вызвать проблемы. Первая включает в себя глобусы ? в именах файлов - хотя это и так уже более робастное решение, чем любое другое предлагаемое здесь, и вероятность того, что вы столкнетесь с ? вообще сама по себе достаточно мала, есть вероятность того, что решение этих глобусов может совпасть более чем с одним именем файла. Подробнее об этом смотрите в here.

Другая возможность связана с ложным срабатыванием - Например, если у вас есть имя файла, фактически совпадающее со строкой date, для которой мы ищем с помощью grep, но которое ни в один из этих дней на самом деле не было изменено. Я не рассчитываю на то, что это будет проблемой, но если это так, то спросите об этом, и я, вероятно, смогу помочь вам уточнить регекс для того, чтобы справиться с этим.

.
1
27.01.2020, 19:51

Почему бы не передать результат поиска через sort, а затем выполнить ls для каждого линий?

find . -type f -ctime -1 | sort | while IFS= read -r filename; do ls -ls "$filename"; done
1
27.01.2020, 19:51

Фактически вы можете использовать комбинацию find, xargs и ls.

Вот пример команды: find. -тип f -print0 | xargs -0 ls -lt

  • find будет рекурсивно искать все файлы в текущем каталоге.
  • xargs передаст этот список файлов команде ls за один вызов (при условии, что find вернет меньше файлов ARG_MAX ).
  • ls -lt отсортирует эти файлы по времени и отформатирует вывод

Чтобы получить информацию о вашей системе ARG_MAX , вы можете ввести:

$ getconf ARG_MAX
> 2621440
0
27.01.2020, 19:51

Теги

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