Я хочу создать список всех файлов в каталоге, не перечисляя ни один из подкаталогов, которые находятся в этом же каталоге, и распечатать этот список в новый файл.
ls -d * > filelist
создаст список всех файлов в текущем каталоге, но также перечислит подкаталоги в текущем каталоге. Я попробовал команду find
, используя опцию -maxdepth 1
- однако формат вывода является проблемой, так как find также выводит путь вместе с именами файлов.
Если кто-нибудь может сказать мне, возможно, другую команду или опции, которые будут использоваться для создания выходного списка только файлов в каталоге, а не имен подкаталогов или их содержимого, я был бы признателен.
Список только имен файлов:
1. ls -p | grep -v / (without hidden files) 2. ls -l | grep ^- | tr -s ' ' | cut -d ' ' -f 9 (without hidden files) a) ls -pa | grep -v / (with hidden files) b) ls -la | grep ^- | tr -s ' ' | cut -d ' ' -f (with hidden files)
Список только каталогов:
1. ls -p | grep / (without hidden) 2. ls -l | grep ^d | tr -s ' ' | cut -d ' ' -f 9 (without hidden) a) ls -pa | grep / (with hidden) b) ls -l | grep ^d | tr -s ' ' | cut -d ' ' -f 9 (with hidden)
grep -v -e ^ $ is to удалить пустые строки из результата.
Подробнее :
Флаг ls -p должен ставить '/' в конце имени каталога, флаг -R - для рекурсивного поиска, -l - для вывода с информацией, -a для перечисления всех (включая скрытые файлы) с информацией, флаг grep -v предназначен для инверсии результатов, а флаг -e - для сопоставления с регулярным выражением.
Для отображения только обычных файлов:
ls -al | grep ^-
С символьными ссылками:
ls -al | grep ^[-l]
Где первый символ списка описывает тип файла, поэтому -
означает что это обычный файл, для символической ссылки l
.
Вывести имена всех подходящих файлов (включая ссылки):
run-parts --list --regex . .
С абсолютными путями:
run-parts --list --regex . $PWD
Распечатать имена всех файлов в /etc
, которые начинаются с p
и заканчиваются d
:
run-parts --list --regex '^p.*d /etc
Я бы предложил использовать find и просто удалить имя каталога из выходных данных, если это необходимо:
find . -type f -maxdepth 1 | sed s,^./,,
Еще одно решение, наивно короткое, которое сработало для меня:
ls -la | grep -E '^[^d]' > files
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 работал правильно.
Решение на основе поиска:
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 & amp; Linux Stack Exchange сайтов.