WedX - журнал о программировании и компьютерных науках

Команда Bash для рекурсивного списка файлов, но с сортировкой по классификации

Я часто использую прекрасную программу find в Bash для просмотра файлов с определенные фильтры. Например, в рабочей копии Subversion (SVN) я иногда хочу рекурсивно перечислить все файлы, кроме подкаталогов .svn, следующим образом:

find . -name '.svn' -prune -o -type f -print

Сегодня я хотел сделать что-то подобное, но я также хотел повлиять на порядок, в котором перечислялось содержимое каталогов: я хотел, чтобы за «обычными» файлами следовали подкаталоги (а затем рекурсивное содержимое). Кажется, для этого нет возможности.

Команда ls (список) позволяет вывести список рекурсивно. Эта команда имеет множество параметров сортировки, включая список по имени файла, времени доступа, размеру и т. д., но не классификацию, хотя параметр -p будет аннотировать каталоги.

Теперь я могу написать, например, скрипт Python, чтобы делать именно то, что я хочу. Однако find уже делает почти все, что я хочу. Обычно в оболочке Bash можно комбинировать программы, чтобы делать именно то, что вы хотите: каждая программа, например find, sort, uniq, ls, wc, выполняет простую задачу, но делает это хорошо. Не каждая программа должна иметь возможность сортировки, потому что sort может сортировать. Так что, правда, мне просто интересно...

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

Например, find дает мне файлы в таком порядке, в алфавитном порядке:

a.txt
b\file1.txt
b\subdir\file2.txt
b\then_file3.txt
c.txt
d\file4.txt
e.txt

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

a.txt
c.txt
e.txt
b\file1.txt
b\then_file3.txt
b\subdir\file2.txt
d\file4.txt

(Я пользователь Windows, но запускаю оболочку Bash в Cygwin.)

Спасибо.

05.11.2009

Ответы:


1

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

find . -type d -exec find {} -type f -maxdepth 1 \;
05.11.2009
  • Это работает, но выдает предупреждения. Их можно отключить опцией -nowarn. 06.11.2009
  • Спасибо! Я думал, что это возможно как-то. Итак, мой пример фильтрации SVN будет find . -name '.svn' -prune -o -type d -exec find {} -type f -nowarn -maxdepth 1 \; 06.11.2009
  • Когда я пытаюсь это сделать, результат не сортируется (по директориям и внутри директорий). 06.11.2009

  • 2
    tree -fi
    

    В Ubuntu и CentOS (а также в Red Hat, Fedora...) он содержится в собственном пакете, называемом "tree" (да). Ubuntu, похоже, не устанавливает этот пакет по умолчанию, в отличие от других.

    РЕДАКТИРОВАТЬ: извините, не понял, что вы используете Cygwin. Ну, он тоже портирован на Cygwin. Если его нет в наборе по умолчанию, см. здесь.

    05.11.2009
  • Вы также можете добавить -a, чтобы получить скрытые файлы. 06.11.2009

  • 3

    Это сначала группирует каталоги на каждом уровне, затем файлы и рекурсии на каждом уровне и делает то же самое:

    ls -lR --group-directories-first
    

    Однако это перевернуто с того, что вы хотели.

    06.11.2009

    4

    Вы не указали, как вы хотите обрабатывать вещи, если каталоги идут более чем на один уровень. Делает ли что-то подобное то, что вы ищете? Он делает список в ширину, отсортированный по каждому уровню глубины:

    $for ((l = 0; l <= 24; l++)); do find . -mindepth ${l} -maxdepth ${l} -type f | sort; done
    
    05.11.2009
  • Это было трудно выразить, поэтому я попытался проиллюстрировать это на примере. Мне не нужны все файлы, а потом и все каталоги (это легко). Находясь в данном каталоге, я хочу сначала перечислить файлы, а затем обработать каждый подкаталог, рекурсивно возвращаясь к каждому из них. 06.11.2009
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]