список файлов с шаблоном с началом и окончанием

9

Я хочу перечислить все файлы в каталоге, которые начинаются с 'abc' и заканчиваются на '.zip'

Я пытаюсь использовать ls.

В каталоге много zip-файлов, начинающихся с abc<date>и xvz<date>. Я только хочу получить списокabc<date>.zip

unix_dude
источник
ls -1 | grep "abc$(your_date).zip" ?
Стэн Струм

Ответы:

15

lsне выполняет сопоставление с образцом в именах файлов. Он просто перечисляет содержимое каталогов и файлов, которые ему передаются в качестве аргументов.

С другой стороны, ваша оболочка имеет функцию под названием globbing или генерация имени файла, которая расширяет шаблон в список файлов, соответствующих этому шаблону.

Вот этот шаблон глобуса abc*.zip( *подстановочный знак, обозначающий любое количество символов ).

Вы передадите его любой команде, например, printfдля печати:

printf '%s\n' abc*.zip

Вы также можете передать его для ls -lотображения атрибутов этих файлов:

ls -ld abc*.zip

(нам нужно, -dпотому что, если какой-либо из этих файлов будет иметь тип directory , в lsпротивном случае будет указан их контент).

Или, чтобы unzipизвлечь их, если только unzipможно извлечь более одного файла одновременно. К сожалению, это не так, поэтому вам нужно использовать xargs -n1либо forцикл:

printf '%s\0' abc*.zip | xargs -r0n1 unzip

Или:

for file in abc*.zip; do unzip "$file"; done

Но на самом деле, unzipбудучи больше похожим на порт команды MS-DOS, unzipсам по себе воспринимает свой аргумент как глобус. Другими словами, unzip 'abc*.zip'не будет разархивирован названный файл abc*.zip(совершенно правильное имя файла в Unix, а не в операционных системах Microsoft), но файлы, соответствующие abc*.zipшаблону, так что вы действительно захотите:

 unzip 'abc*.zip'

(На самом деле наш xargsи forвышеприведенный подход был бы неправильным, потому что, если существует, abc*.zipнапример, вызываемый файл , он unzipбудет bsdtarвосприниматься как шаблон! Смотрите более удобный способ извлечения zipархивов)


Для сопоставления без [aA][bB][cC]*.[zZ][iI][pP]учета регистра вы бы использовали переносимость. В некоторых оболочках есть расширенные операторы globbing для сопоставления без учета регистра:

  • zsh:

    setopt extendedglob
    ls -ld (#i)abc*.zip
    

    Или:

    ls -ld ((#i)abc)*.zip
    

    если вы хотите, чтобы эта abcчасть была без учета регистра.

  • ksh93:

    ls -ld ~(i)abc*.zip
    

    или:

    ls -ld ~(i:abc)*.zip
    
  • с bash.

    shopt -s nocaseglob
    ls -ld abc*.zip
    

    (нет никакого способа, чтобы там чувствовали регистр только части глобусов, кроме как с помощью переносимого синтаксиса).

  • с yash:

    set +o case-glob
    ls -ld abc*.zip
    

    то же самое замечание, что и bashвыше.

Стефан Шазелас
источник
9
ls abc*.zip

Это, однако, завершится ошибкой, если файлов слишком много (расширение оболочки ограничено количеством аргументов, до которых она может расширяться).

find . -name "abc*.zip"

Это, наверное, самый универсальный. Цитаты должны быть там. В некоторых findреализациях вы также можете использовать -inameвместо -nameпоиска без учета регистра ( aBc<date>.ZIPтакже будет соответствовать).

ls | grep -x "abc.*\.zip"

Имейте в виду, .*и \.поскольку фильтр grep использует regex, он отличается от подстановочного знака, который оболочка использует для расширения. Используйте grep -iдля поиска без учета регистра.

Ян Дусек
источник
1
Обратите внимание, что этот предел не является пределом оболочки. Это ограничение ядра в execve()системном вызове.
Стефан Шазелас
Вероятно, следует отметить, что findэти файлы будут искать и в подкаталогах. Используйте find . ! -name . -prune -name 'abc*.zip' -printили, find . -maxdepth 1 -name 'abc*.zip'если ваша findподдержка -maxdepthпохожа на GNU или BSD, или find . -depth 1 -name 'abc*.zip'если ваша findподдержка -depth <n>похожа на некоторые BSD, чтобы ограничиться текущим каталогом.
Стефан Шазелас
$ ls ../*.aработал для меня (список архивов в родительском каталоге).
Даниил
0

Попробуйте использовать, ls abc*.zipчтобы сузить результаты до тех, которые соответствуют вашим критериям для начальной строки abc и окончания .zip. Звездочка расширится, чтобы соответствовать этим результатам без включения начальных символов xvz.

Джефф
источник
-1

Вы должны указать каталог, где lsбудете искать в примере

ls -la ~/file*.* 
ls -la ./file*.*

это работает для меня, но, очевидно, он не поддерживает поиск по шаблону

Кевин Монтальво
источник
1
Это не решает вопрос; файлы должны начинаться с abcи заканчиваться на .zip.
Джефф Schaller