Я часто использую прекрасную программу 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.)
Спасибо.
-nowarn
. 06.11.2009