перечисление файлов в каталоге без перечисления подкаталогов и их содержимого в этом каталоге


24

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

ls -d * > filelist

создаст список всех файлов в текущем каталоге, но он также перечислит подкаталоги в текущем каталоге. Я попробовал findкоманду, используя -maxdepth 1опцию - однако, формат вывода является проблемой, так как find также выводит путь вместе с именами файлов.

Если кто-нибудь может подсказать мне, возможно, другую команду или опции, которые будут использоваться для вывода списка только файлов в каталоге, а не имен подкаталогов или их содержимого, я был бы признателен.


2
Я запутался ls -d *только в списке файлов и папок в текущей папке, исключая скрытые файлы / папки здесь;
GM-Script-Writer-62850

да, но я не хочу, чтобы папки в этом каталоге были в списке, только хочу, чтобы файлы в этом каталоге были в списке
janet

Ответы:


22

Решение на основе поиска:

find . -maxdepth 1 -type f -printf '%f\n'

Решение на основе Bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

Решение на основе bash даст вам все, что не является каталогом; это будет включать в себя такие вещи, как именованные каналы (вы, вероятно, хотите это). Если вам нужны только файлы , используйте findкоманду или один из них:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Если вы собираетесь использовать это регулярно, вы, конечно, можете поместить это в псевдоним где-то в вашем ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Поскольку вы отметили в комментариях, что на самом деле вы используете OSX, а не Ubuntu, я бы посоветовал вам в следующий раз направлять вопросы на Apple или на более общие сайты Unix & Linux Stack Exchange.


1
Убедитесь, что эти решения правильны для вас, основываясь на том, хотите ли вы включить скрытые файлы.
Кевин Уилер

10

Список только имен файлов:

1. ls -p | grep -v / (без скрытых файлов)
 2. ls -l | grep ^ - | tr -s '' | cut -d '' -f 9 (без скрытых файлов)

 а) ls -pa | grep -v / (со скрытыми файлами)
 б) ls -la | grep ^ - | tr -s '' | cut -d '' -f (со скрытыми файлами)

Список только каталогов:

1. ls -p | grep / (без скрытого)
 2. ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (без скрытых)

 а) ls -pa | grep / (со скрытым)
 б) ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (со скрытым)

grep -v -e ^ $ - удалить пустые строки из результата.

Более подробная информация :
флаг ls -p должен ставить '/' в конце имени каталога, флаг -R - для рекурсивного поиска, -l - для вывода информации, -a - для вывода всего (включая скрытые файлы) с информацией, grep -v флаг для инверсии результатов и -e флаг для сопоставления регулярных выражений.


7

Для просмотра только обычных файлов:

ls -al | grep ^-

С символическими ссылками включены:

ls -al | grep ^[-l]

Где первый символ списка описывает тип файла, это -означает, что это обычный файл, для символической ссылки есть l.

Debian / Ubuntu

Напечатайте имена всех подходящих файлов (включая ссылки):

run-parts --list --regex . .

С абсолютными путями:

run-parts --list --regex . $PWD

Напечатайте имена всех файлов, /etcкоторые начинаются с pи заканчиваются на d:

run-parts --list --regex '^p.*d$' /etc

5

Еще одно решение, наивно короткое, которое сработало для меня:

ls -la | grep -E '^[^d]' > files

идеально подходит для меня,ls -alR |grep -E '^-'
здесь

4

Я бы предложил использовать find и просто удалить имя каталога из вывода:

find . -type f -maxdepth 1 | sed s,^./,,

2
-maxdepth 1должна перед любыми фильтрами, и вы можете достичь этого результата без использования sedс -printfопцией, то есть: find . -maxdepth 1 -type f -printf '%f\n'(это будет более эффективным , чем при использовании дополнительной программы).
evilsoup

3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Другой возможный вариант

ls -F | grep -v '/' | sed /[@*]$// > filelist

В --file-typeСтавит / в конце папки (но и @ в конце символических ссылок. The grep -v '/'Удаляет подкаталоги (потому что они теперь заканчиваются символом «/»). В sed s/@$//убирает , что @. -1 печатает один файл в каждой строке так что grep -v будет работать правильно.


Благодарю за ваш ответ. к сожалению, это не работает для меня, возможно, я выполняю это неправильно. если я использую точную команду, которую вы мне дали, я получаю следующую ошибку: ls: недопустимый параметр - - использование: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [file ...] я попытался использовать подстановочный знак * вместо, а также в в сочетании с --file-type. если бы вы могли уточнить, я был бы признателен за это!
Джанет

Команда работает для меня (работает 13.04), какую версию Ubuntu вы используете ?; -1не имеет значения, чтобы grep вам это не нужно; если вы хотите -als
включить

на самом деле, я работаю на Mac. возможно, команда немного отличается на Mac OS X или Unix?
Джанет

1
Вы также можете попробоватьls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.