Сортировка вывода find -exec ls

Возможно ли выход find … -exec ls -ls ; отсортировано по алфавиту, по имени файла?

Это моя команда cron:

 find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \; 

Эта команда работает нормально, по большей части. Но результаты не сортируются в какой-либо значимой последовательности. Было бы очень полезно, если бы они были отсортированы по полю имени файла.

  • описание порядка сортировки
  • Сортировка данных журнала с помощью bash
  • Добавить слова в список слов с помощью sort -u avoinding duplicata
  • вывод искажается при параллельном запуске «xargs ls»
  • Как сортировать имена файлов в числовом порядке и измененный порядок времени?
  • Поиск файлов, содержащих строку, и список их имен, отсортированных по дате изменения
  • Как можно сортировать поле CPU команды ps?
  • Сортировка вывода ps не работает
  • 5 Solutions collect form web for “Сортировка вывода find -exec ls”

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

     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 с zstat ).

     autoload -U zargs zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf 

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

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

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

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

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

    … если файл был изменен за последние шесть месяцев или:

     date "+%b %e %Y" 

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

     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 длинный список
    3. -R рекурсивно перечислить все дочерние каталоги
    4. -c время изменения отображения, а не время доступа
    5. -q вернуть оболочку glob ? а не непечатаемые или \t ab символы в имени файла

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

    1. Пустая строка, предшествующая имени пути и следующей строке
    2. Строки, начинающиеся с - (другими словами – не d для каталога), которые также содержат вашу date .
    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 , и именно поэтому он может надежно сортировать все, что он делает по умолчанию, и поэтому sort также сделана вспомогательной.

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

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

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

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

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

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

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

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

    Для извлечения вашей системы ARG_MAX вы можете ввести:

     $ getconf ARG_MAX > 2621440 
     ls -l $(find /home/setefgge/public_html -type f -ctime -1 | sort) 
    Linux и Unix - лучшая ОС в мире.