Як зіставити нечутливі шаблони з ls?


57

Я хотів би перерахувати всі файли, що відповідають певній схемі, ігноруючи цей випадок.

Наприклад, я запускаю такі команди:

ls *abc*

Я хочу бачити всі файли, які мають "abc" як частину імені файлу, ігноруючи регістр, як

-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file1abc.txt
-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file2ABC.txt

Примітка

Я шукав сторінку чоловіка на випадок, але нічого не зміг знайти.

Відповіді:


65

Це насправді робиться вашою оболонкою, а не ls.

В bash, ви б використовували:

shopt -s nocaseglob

а потім запустіть свою команду.

Або в zsh:

unsetopt CASE_GLOB

Або в яші:

set +o case-glob

а потім ваша команда.

Ви можете поставити це відповідно .bashrc, .zshrcабо .yashrc, відповідно.

Крім того, за допомогою zsh:

setopt extendedglob
ls -d -- (#i)*abc*

(тобто нечутливий глобус, що складається з регістра, на основі підстановки)

З ksh93:

ls -d -- ~(i:*abc*)

Ви хочете, щоб глобус працював інакше, а не lsце всі файли, передані lsоболонкою.


Як сказати в bash, як відновити початкові налаштування, якщо я використовую shport -s nocaseglob?
mtk

6
@mtk: щоб встановити параметр, ви використовуєте shopt -s; щоб зняти його, ви використовуєте shopt -u. Крім того , ви можете обернути все в субоболочке за допомогою ( )так що установка не впливає на батьківську оболонку: (shopt -s nocaseglob ; ls *abc*).
ruakh

Так що в POSIX або SUS немає подібних портативних способів чи чогось подібного (крім [aA][bB][cC])?
Тимофій Гу

Відмінне рішення, я не можу повірити, що я не натрапив на shoptкоманду за останні 15 років використання bash!
Реза Санайе

Відповідь Jfg956 - правильна (наступна). Навіщо змінювати поведінку оболонки, коли для цього у вас є регулярний вираз?
EnzoR

20

Як пояснив Polemon, *abc*перелік файлів поширюється на оболонку (не ls) . Це називається узгодження шаблонів .

Окрім зміни цілої поведінки відповідності шаблонів, щоб ігнорувати регістр, ви можете використовувати іншу форму відповідності шаблону, ніж *. Виконайте наступне:

ls *[aA][bB][cC]*

Від баш людини:

[...] Збігає будь-який із вкладених символів.

Це дозволяє більш тонке відповідність зерна , де ви могли б використовувати , *[aA][bB]c*щоб відповідати abcабо , ABcале не abCабо ABC. Або приклад французькою мовою, де я міг би відповідати всім екземплярам eсимволу:

ls *[eéèêëEÉÈÊË]*

1
На жаль, такий підхід швидко стає непростим, оскільки модель стає довшою. Але для коротких речей це працює.
дероберт

@derobert: цілком вірно, особливо це (і це, мабуть, так) оболонка оптимізувала збіг ігноруючих випадків, поставивши всі імена файлів та запит на збіг у нижчих випадках перед порівнянням. Однак, ця користь [...]може бути корисною у багатьох випадках, і я хоч і мала її згадати.
jfg956

1
Це правильна відповідь. Зміна поведінки оболонки - ні.
EnzoR

Якщо локаль налаштований належним чином, ви повинні мати можливість використовувати класи еквівалентності [[=e=][=E=]].
Бенджамін В.

8

Ви також можете додати -iопцію (--ignore-case), grepщоб отримати і вихід нижче.

[root@localhost ~]# ls -l | grep -i abc
-rw-r--r--  1 root root    0 Feb 25 20:41 fileabc.txt
-rw-r--r--  1 root root    0 Feb 25 20:41 fileABC.txt

Відповідність шаблонів має кращі показники порівняно з grep, оскільки grep потрібно зібрати все, а потім відфільтрувати. Має помітну різницю при роботі з більшою папкою.
Омі

@Omi Крім того, регулярні вирази призначені для тексту , зокрема рядків тексту. Імена файлів можуть містити нові рядки.
Кусалаланда

3

Я не думаю, що це можливо для ls, але ви можете використати пошук натомість:

find . -maxdepth 1 -iname '*abc*'

0

використовувати наступний код:

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE

Для чого змінна LC_COLLATE? ви можете пояснити далі.
mtk

натисніть на посилання, щоб знати про це @mtk
user1678213

0

Ви можете GREP-файл, використовуючи -iякий додає нечутливий параметр.

Наприклад, щоб знайти обидва, abcі ABCви можете запустити цю команду

    [root@mtk bin]# ls -l | grep -i abc
    640K -rw-r--r-- 1 mtk mtk 639K Sep 21 08:12 file1abc.txt
    676K -rw-r--r-- 1 mtk mtk 674K Sep 21 08:12 file2ABC.txt

5
Луїс Перес. Я думаю, ти -iніде не використовував варіант, де ти командував.
Монгрел


-2

У tcsh встановіть псевдонім у .aliases

alias lsnc "ls BS!* | sort -f "

("BS" = один "зворотний кут"; мені довелося скористатися цим, щоб відобразити його у своєму браузері.)

і використовувати lsncзамістьls

У bash, спробуйте псевдонім у .bash_aliases, як

lsnc() { ls $1 | sort -f ; }

Опції ls, наприклад ls -l, ось, тут просте виправлення:

tcsh:

alias lsncl "ls -l BS!* | sort -f -k 9"

баш:

lsncl() { ls -l $1 | sort -f -k 9 ; }

Ви впевнені, що =після lsnocase ви не пропускаєте ' '?
Антон

Ентон: (переглянуті) lsnc та lsncl працюють для мене під tcsh та bash на Cygwin та Ubuntu. Зауважте, що для bash я використовую функцію, а не "псевдонім" як такий. Лестер
Лестер Інгбер

Ентон: Так, ви, ймовірно, можете використовувати псевдонім у bash, як псевдонім lsncl = 'ls -l $ 1 | sort -f -k 9 '
Лестер Інгбер

Ця відповідь не стосується конкретного питання, яке хоче передати передані файли ls, щоб вони трактувалися як нечутливі до регістру. Якщо оболонка проходить проходить занадто мало файлів ls, немає нічого , lsі sortможе може виправити ситуацію. Як зазначається в інших відповідях, проблему потрібно вирішити в оболонці, а не з lsсинтаксисом.
Марк Стосберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.