Список файлів, які відповідають шаблону, але ігнорують файли, які відповідають іншому шаблону?


12

Скажімо, у мене є каталог з файлами a1, a2, a3, b1, b2, b3. Я хочу лише відповідати файлам, які починаються, aале не містять 3. Я спробував, ls -I "*3" *a*але він повертається a1 a2 a3, хоча я не хочу, щоб він відповідав a3. Це можливо за допомогою ls?


Тут цікавий різноманітний набір відповідей, але пояснення того, чому не вдається ls -I '* 3' a *, було б повчальним. та / або чому глобальний список оболонки згодом не фільтрується перемикачем ігнорування на ls?
Теофраст

Сторінка man говорить про опцію -I: do not list implied entries matching shell PATTERNпроте вона не пояснює, що мається на увазі під загальним розумінням , але я здогадуюсь, що вона стосується лише файлів, які lsотримує глобальні розширення - і lsне розширює a*, оболонка робить це .
Мюррей Йенсен

Відповіді:


14

Просто:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob активує розширений глобул.
  • a відповідає стартовому a
  • !()заперечує матч всередині ()...
    • *3*що є 3і що-небудь до або після нього.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
FYI, вимагаєset -s extglob
Брайан

@Brian Yea, щойно помітив ^^
хаос

8

Існуючі відповіді вказують найкращий спосіб зробити це за допомогою глобусів; Я включу це, тому що в більшості випадків findкращий варіант, якщо ви хочете зробити сценарій або подальшу обробку:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

Ви можете подати відповідь на xargsпрості дії або на while readцикл для більш складних речей.


4

Простий спосіб

  • перерахувати всі файли, які відповідають a*
  • потім видаліть усі рядки, що містять a 3

Команда UNIX є

ls -1 a* | grep -v 3

ls -1 показує один файл у рядку.

grepзазвичай знаходить лінії, які відповідають шаблону, але при -vцьому поведінка перевернута, тобто grep знаходить лінію, яка не відповідає цьому шаблону.


2
Привіт Пітер! Найкраще було б пояснити якомога детальніше, як працює ваше рішення.
даг

2
Синтаксичний lsне ідея Goob: mywiki.wooledge.org/ParsingLs
хаос

3

З zshвикористанням ~ глобального оператора :

setopt extendedglob
print -rl -- a*~*3*

З gnu lsвами можна використовувати два --ignoreваріанти:

ls -I '[^a]*' -I '*3*'

1-ий ігнорує всі імена файлів, які не починаються з, aа 2-й ігнорує імена файлів, які містять3

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.