Рассмотрите следующий список каталогов:
/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
но я испытываю нехватку кофе. Выпустите Ниндзя!
Другое решение - работать с пробелами в путях.
find . -type d -exec sh -c 'find "{}" -maxdepth 1 -type f | sort | head -n 1' ";"
. В дополнение к этому, я обнаружил, что в ls
отсутствуют опции для вывода полных путей и для вывода списка только файлов (не dirs). ): (
Хорошо с небольшим количеством ввода по абсолютному адресу, мои собственные навыки Ниндзя регенерировали немного и придумали этот пароход:
find -type d | xargs -I{} bash -c "find {} -maxdepth 1 -type f | sort | head -1" | sort
Не самый изящный из запросов файловой системы, но это производит то, что я ожидал бы.
Используя преимущества 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