it-swarm-ru.tech

Как вывести список файлов без каталогов и отфильтровать по имени (параметры ls)

У меня есть каталог с именем uploads. Он содержит несколько файлов, а также несколько подкаталогов, которые в свою очередь содержат файлы.

Есть ли способ, которым я могу (за один шаг) сделать следующее:

  1. Перечислять ТОЛЬКО файлы в корневом каталоге загрузок - я не хочу видеть имена подпапок или их содержимое;

    и

  2. НЕ перечисляйте файлы, начинающиеся с t_

Я знаю о -d флаг, но это не дает мне того, чего я хочу.

45
EmmyS

Это звучит как работа для find.

  • Используйте -maxdepth чтобы вернуть только текущий каталог, а не рекурсивно искать внутри подпапок
  • Используйте -type f чтобы возвращать только файлы, а не каталоги или узлы устройств или что-либо еще
  • Используйте комбинацию, если -not а также -name чтобы избежать файлов с именами, которые вам не нужны

Это может сложиться так:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
55
Caleb

GNU ls (то есть команда ls в не встроенных системах Linux и Cygwin, также доступная в некоторых других устройствах) имеет возможность скрыть некоторые файлы на основе их имен. Там нет способа игнорировать каталоги, хотя.

_ls --hide='t_*' uploads
_

Другой подход заключается в том, чтобы заставить ваш Shell выполнить сопоставление. Bash, ksh и zsh имеют шаблон отрицания !(t_*) для соответствия всем файлам, кроме тех, которые соответствуют _t*_; в bash эту функцию нужно включить с помощью _shopt -s extglob_, а в zsh ее нужно включить с помощью _setopt ksh_glob_. Zsh также имеет эквивалентный синтаксис _^t_*_, который необходимо включить с помощью _setopt extended_glob_. Это все еще не игнорирует каталоги. В Zsh есть дополнительная функция, которая позволяет сопоставлять файлы не только по имени, но и по метаданным и т. Д .: glob qualifiers . Добавьте _(.)_ в конце совпадения, чтобы ограничиться обычными файлами. Отрицание _^_ является частью синтаксиса соответствия имен, поэтому ^t_*(.) означает "все обычные файлы, не соответствующие _t_*_", а не "все файлы, которые не являются обычными файлами, совпадающими с _t_*_".

_setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)
_

Если вы оказались без продвинутых инструментов, вы можете сделать это на любом Unix с помощью find. Это не та вещь, которую вы обычно печатаете в командной строке, но она мощная и точная. Caleb уже показал, как это сделать с помощью GNU find . Опция _-maxdepth_ не переносима; вместо нее можно использовать _-Prune_, переносимо остановить find от повторения.

_find uploads/* -type d -Prune -o \! -type f -name 't_*' -print
_

Замените _-print_ на _-exec ls -lG -- {} +_, чтобы выполнить ls с вашими любимыми параметрами для файлов.

Все команды выше скрывают точечные файлы (то есть файлы, чье имя начинается с _._). Если вы хотите отобразить их, передайте _-A_ в ls или добавьте спецификатор глобуса D в zsh (ls uploads/^t_*(.D)). С find вы можете использовать другой подход, чтобы заставить его повторять только один уровень (find не обрабатывает точечные файлы специально). Это полностью работает, только если вы запускаете find в текущем каталоге.

_cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
_
18
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$
1
RICARDO MARMOLEJO GARCIA

Если проблема переносимости find -maxdepth является проблемой, вы можете использовать:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Я не эксперт, но я думаю, что это должно работать. Я полагаю, это выглядит немного загадочно, но если вы говорите на awk, это действительно не так. $ NF можно использовать вместо $ 9. Вы также можете сделать:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

который делает то же самое (но, возможно, менее эффективно, чем первый ???).

На самом деле, подумав о других постах, выглядит

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

это еще короче и яснее.

Кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь. :-)

0
kkaszub

Я нашел эти короткие пути:

ls -p uploads | grep -Ev '/'

или

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

Позвольте мне сделать это, используя ls и ​​трубы:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

скажем, последний столбец 9-й.

0
Y0NG