Рекурсивно найдите каждый первый файл при каждом ответвлении дерева каталогов

Рассмотрите следующий список каталогов:

/a/1
/a/2
/a/3
/b/1
/b/2
/b/3/a
/b/3/b
/c/a.whatever
/c/b
/c/c

Я хочу команду, которая найдет первое (алфавитно-цифровой вид) файлом в каждом каталоге (inc вложенный) и обеспечит следующий вывод:

/a/1
/b/1
/b/3/a
/c/a.whatever

Это походит на задание для find но я испытываю нехватку кофе. Выпустите Ниндзя!

1
задан 11 October 2012 в 15:48

3 ответа

Другое решение - работать с пробелами в путях.

find . -type d -exec sh -c 'find "{}" -maxdepth 1 -type f | sort | head -n 1' ";"

. В дополнение к этому, я обнаружил, что в ls отсутствуют опции для вывода полных путей и для вывода списка только файлов (не dirs). ): (

0
ответ дан 11 October 2012 в 15:48

Хорошо с небольшим количеством ввода по абсолютному адресу, мои собственные навыки Ниндзя регенерировали немного и придумали этот пароход:

find -type d | xargs -I{} bash -c "find {} -maxdepth 1 -type f | sort | head -1" | sort

Не самый изящный из запросов файловой системы, но это производит то, что я ожидал бы.

0
ответ дан 11 October 2012 в 15:48

Используя преимущества awk я придумал это:

find -type d | awk '{print "find "$0" -type f | head -1"}' | sh | uniq

uniq становится необходимым, потому что находят поиски, подкаталоги..., вероятно, могли обойти это с дополнительным аргументом находки так или иначе.

править
версия без uniq

find -type d | awk '{print "find "$0" -maxdepth 1 -type f | head -1"}' | sh

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

find -type d | awk '{print "find "$0" -maxdepth 1 -type f | sort | head -1"}' | sh
1
ответ дан 11 October 2012 в 15:48

Другие вопросы по тегам:

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