Если я наберу:
ls source/*
source/fonts:
fontello
source/images:
bg1.png eng.png fra.png
Я получаю список файлов, сгруппированных по именам папок. Как я могу просто получить список имен файлов?
ls source/*
source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Благодарность
find
неправильные, особенно, если вы бежитеfor file in $(find ...)
, вы попали в один из них).Ответы:
Кажется невозможным без изменения выходных данных, но есть простой альтернативный способ:
Или (специфично для GNU find), чтобы получить файлы только на глубине вашего вопроса:
(или, если вы хотите каталоги, которые
ls
вам дает, удалите-type f
)источник
Вы можете просто придерживаться ls, если добавите несколько psychedlics (
ls -d
):источник
find
жирный зверь.Вы можете быть заинтересованы в «бедняков
find
»:shopt -s
s ETs именованный параметр оболочки (ы).globstar
Параметр определяется следующим образом в Баш (1) :Итак, после того, как вы сделали
shopt -s globstar
, любую из следующих команд:будет производить вывод:
К сожалению, это включает и имена каталогов. Это может помочь вам немного узнать,
будет производить вывод:
т.е. только имена каталогов. Вы можете перенаправить вывод одного из первого набора команд для одного файла, перенаправить вывод из выше второго файла, а затем использовать
comm
,diff
или что - то подобное, чтобы вычесть второй файл из первых, оставив только равнину файлы (не каталоги). Но не делай этого.Другой подход (это не намного лучше)
--file-type
Опция указываетls
на отобразить/
в конце каждого имени каталога (и другие символы на концах другого (специальные) типы файлов), как это:а затем
grep -v '/$'
удаляет строки, которые заканчиваются/
; т.е. имена каталогов. К сожалению,--file-type
опция не указана в POSIX . Если ваша версияls
не поддерживает ее, используйте-F
. Это похоже на то,--file-type
за исключением того, что он также отображает*
в конце имен исполняемых файлов, что некоторые люди считают раздражающим. Вы можете устранить их с помощьюsed
:Если вы хотите что-то сделать со всеми файлами (и только файлами), вы можете сделать
Примечания:
ls
выводится на терминал, и он не находится в режиме-l
( l ong), он записывает несколько имен в строке (если имена не очень длинные). Вы можете заставить его написать одно имя в строке, указав-1
(один) или перенаправив вывод в файл или канал.--
in,ls
поскольку вы выводите каталог, содержимое которого вы создали. Вы должны использовать его при перечислении*
в неизвестном каталоге, в качестве защиты от имен файлов, которые начинаются с-
.ls
.globstar
оболочки, по-видимому, не определяется POSIX. (На самом деле, я не уверен, что POSIX распознает какие-либо параметры оболочки.) Хотя это выглядит какbash
ism, будьте осторожны - он может присутствовать не во всех версиях bash.Если
fonts
илиimages
имеет подкаталоги,**
перечислит их все, рекурсивно, до конца. Один (несколько грязный и ненадежный) способ ограничения глубиныкоторый удаляет строки, содержащие три или более
/
символов.источник