Intereting Posts
Выполнение команды bash внутри функции рыбы Цитаты в командах – пример grep Простейший способ узнать, полностью ли загружено и готово приложение GTK (например, Firefox), чтобы максимизировать его Как решить странную ошибку при запуске Google Chrome? Приостановка глобальных сочетаний клавиш KDE и X-Windows при запуске определенного приложения Как проверить, является ли блок-устройство доступным только для чтения из / sys или / proc? Как получить хвост -f с цветным выходом с помощью vim? Как я могу узнать, какую версию OS X я запускаю из командной строки? Как написать скрипт bash в Makefile Какое приложение можно использовать для блокировки узлов с регулярным выражением? Как настроить аварийную выключение клавиатуры на Linux? механизм разрешения монтирования для файловых исследователей Как удалить сообщение при открытии терминала / решить? Как я могу исправить мои искаженные искажения X11? Редактор тегов Mass ID3, например vorbistagedit?

ls: Не показывать каталоги, которые соответствуют одному шаблону в подстановочных поисках, только файлы

Предположим, что у меня есть что-то вроде следующего: типичная ситуация с бизнес-ПК:

drwxr-xr-x 1 whatever whoever 3 Oct 3 16:40 invoices2009 drwxr-xr-x 1 whatever whoever 4 Oct 3 16:40 invoices2010 drwxr-xr-x 1 whatever whoever 2 Oct 3 16:40 invoices2011 -rwxr-xr-x 1 whatever whoever 440575 Oct 3 16:40 tax2010_1 -rwxr-xr-x 1 whatever whoever 461762 Oct 3 16:40 tax2010_2 -rwxr-xr-x 1 whatever whoever 609123 Oct 3 16:40 tax2010_3 

Теперь давайте будем ленивы и просто введите:

 $ ls -l *2010* 

Предположим, что в каталоге invoices2010 есть что-то, но не будет работать так, как ожидалось. Поскольку имя каталога также содержит год 2010 , ls также будет перечислять файлы в invoices2010 , хотя я хочу только перечислить их в текущем каталоге. Еще смешнее: представьте, что файлов tax2010 * не было вообще, и не было этих трех каталогов, как в примере, но 50 из них. Да, я пробовал: ls даже не укажет, какие файлы находятся в каталоге, но просто перечислите их сверху вниз, точно так же, как если бы все файлы находились в текущем каталоге (если вы явно не указали параметр -R , действительно знаю)

Кроме того, я знаю, что я тоже могу это сделать с помощью find , но есть ли способ выполнить эту задачу с помощью простого однострочного ls (что, очевидно, имеет гораздо менее сложный синтаксис)?

Похоже, ваш вопрос: «Как перечислять файлы по шаблону, исключая каталоги только с помощью ls ».

Нет никакого способа сделать это с чистыми ls . Вы можете комбинировать ls + grep как:

 ls -ld *2010* | grep -v '^d' 

Однако для этого гораздо лучше использовать find :

 find . -maxdepth 1 -type f -name "*2010*" 

Невозможно выборочно фильтровать каталоги, используя только ls . Вам нужно find или ls | grep ls | grep , как описано в ответе спешки . Но для вашего конкретного примера, чтобы ответить на вопрос, который вы задали в своем комментарии :

Итак, снова: я хочу, чтобы в этом каталоге указывались файлы налога *, но каталог «invoices2010», который находится в том же рабочем каталоге и который также соответствует данному шаблону подстановки 2010 года, должен быть пропущен в списке.

ты можешь сделать

 ls -l --ignore='invoices*' *tax2010* 

который отфильтровывает все, что соответствует шаблону ignore оболочки.

Использовать zsh …

 ls -l *2012*(.) 

Квалификатор glob . означает только обычные файлы.

ls -dlp *2010* будет хорошим началом для решения, но это зависит от того, что вы хотите, чтобы результат выглядел.

Не используйте grep с ls,

В bash вы можете отображать файлы с именем «2010», но не глядя на число:

ls -l *[!0-9]2010*

Есть причины не grep против ls но если вы их игнорируете, это работает. Используйте команду ls в качестве входного массива, вызовите ls -ld для каждой записи, ls -ld к grep чтобы исключить каталоги с выходом, отправленным на нуль, и, если удастся выполнить эхо исходный ввод:

 for list in `ls` ; do ls -ld $list | grep -v ^d > /dev/null && echo $list ; done ; 

Вы можете инвертировать grep и условный вывод, такие же результаты:

 for list in `ls` ; do ls -ld $list | grep ^d > /dev/null || echo $list ; done ; 

EDIT: Мой плохой, это работает без соответствия шаблону, но если вы добавите поиск подстановочных знаков, как в вышеприведенном OP, и у вас есть каталог, соответствующий шаблону, вывод по-прежнему включает в себя системные сообщения, поэтому вам нужно будет фильтровать дальше, чтобы получить просто список файлов.

EDIT снова: фиксированные обратные косые черты на / dev / null.