Я знаю, что могу сделать это, чтобы получить список имен каталогов:
find . -type d -maxdepth 1
Вывод выглядит так:
.
./foo
./bar
Я предпочитаю листинг без ./
. Есть ли способ получить find для вывода только необработанных имен?
Я попытался отправить список в stat, чтобы отформатировать его, но это просто дает мне тот же результат:
find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
foo bar ...
все на одной линии без./
спереди?Ответы:
С GNU
find
вы можете использовать-printf
опцию:Как отметил Павел в комментариях, если вы не хотите, чтобы текущий каталог отображался в списке, добавьте
-mindepth 1
, например:источник
-printf
опции в последней спецификации POSIX, и мне интересно, насколько она портативна ...printf
POSIX не упоминает ни об одном из этих параметров, и, похоже, они не поддерживаются некоторыми другимиfind
версиями. GNU find может быть установлен в большинстве мест, поэтому в этом смысле он переносим.-mindepth 1
если вы хотите избавиться от.
Обновить:
Более короткая альтернатива:
Даст вам имена, по одному в строке, без слешей
источник
ls
. В то же время я разместил ссылку о том, почему это плохая идея в другом ответе, который был удален с тех пор. В то время было только 2 ответа, и причина казалась очевидной. Я рад, что вы указали на двусмысленность, и вот мое объяснение. Для протокола, я превратил свое отрицательное голосование в положительное, потому что я согласен с вашим текущим ответом.\n
в каталоге есть имя, которое вы не можете использовать cut, чтобы получить его (что вы и делали, когда я отказался от вас). Есть несколько случаев, когдаls
не ведет себя опасно, и почти всегда безопаснее использовать другой способ.Используя GNU find, вы можете использовать -mindepth для предотвращения поиска find в текущем каталоге:
Поскольку вы не делаете это рекурсивно, вы можете использовать bash glob:
Добавление конечного / к глобу вызовет сопоставление только каталогов.
источник
*/
пропускает точечные файлы и включает в себя символические ссылки. Это может или не может быть проблемой.Давайте
sed
удалим эти два символа:источник
Я бы лучше использовал:
источник
Я обычно использую:
Но я не знаю, правильно ли это делать то, что вы хотите.
источник
echo */
будет делать то же самое, более или менее (он пропускает точечные файлы и содержит символические ссылки), но затем joachim спрашивает, как удалить финал/
.В AIX параметр maxdepth не работает.
В целом это работает для меня:
find ./ -type d | cut -d"/" -f2 | sort -u
источник
То, что вы ищете, называется
basename
, оно игнорирует структуру каталогов unixПример ниже:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
он исключит для вывода даже путь dir, избавляя от необходимости
cd
перед выполнением командыНекоторая дополнительная информация:
Я бы передал в
-exec
качестве аргумента вместо|
(трубу) другую команду для вывода (избегая того, чтобы вторая команда проходила по каждой строке вывода, сказав, что в зависимости от вывода это может улучшить производительность сценария)ПРИМЕЧАНИЕ:
find
параметры не являются позиционными (-maxdepth влияет на тесты, указанные до него, а также на те, которые указаны после него).источник