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

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

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

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

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

Это похоже на работу для find но у меня кончается кофе. Выпусти ниндзя!

3 ответа

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

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

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

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

найти тип d | awk '{print "find "$0" -type f | head -1"}' | ш | уник

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

редактировать
версия без уникального

найти тип d | awk '{print "find "$0" -maxdepth 1 -type f | head -1"}' | ш

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

найти тип d | awk '{print "find "$0" -maxdepth 1 -type f | sort | head -1"}' | ш

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

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

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

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