Рекурсивно найти каждый первый файл в каждой ветви дерева каталогов
Рассмотрим следующий список каталогов:
/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
Не самый элегантный из запросов файловой системы, но он выдает то, что я ожидал.