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
(нет никакого способа, чтобы там чувствовали регистр только части глобусов, кроме как с помощью переносимого синтаксиса).
Это, однако, завершится ошибкой, если файлов слишком много (расширение оболочки ограничено количеством аргументов, до которых она может расширяться).
find . -name "abc*.zip"
Это, наверное, самый универсальный. Цитаты должны быть там. В некоторых findреализациях вы также можете использовать -inameвместо -nameпоиска без учета регистра ( aBc<date>.ZIPтакже будет соответствовать).
ls | grep -x "abc.*\.zip"
Имейте в виду, .*и \.поскольку фильтр grep использует regex, он отличается от подстановочного знака, который оболочка использует для расширения. Используйте grep -iдля поиска без учета регистра.
Обратите внимание, что этот предел не является пределом оболочки. Это ограничение ядра в 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.
ls -1 | grep "abc$(your_date).zip"
?Ответы:
ls
не выполняет сопоставление с образцом в именах файлов. Он просто перечисляет содержимое каталогов и файлов, которые ему передаются в качестве аргументов.С другой стороны, ваша оболочка имеет функцию под названием globbing или генерация имени файла, которая расширяет шаблон в список файлов, соответствующих этому шаблону.
Вот этот шаблон глобуса
abc*.zip
(*
подстановочный знак, обозначающий любое количество символов ).Вы передадите его любой команде, например,
printf
для печати:Вы также можете передать его для
ls -l
отображения атрибутов этих файлов:(нам нужно,
-d
потому что, если какой-либо из этих файлов будет иметь тип directory , вls
противном случае будет указан их контент).Или, чтобы
unzip
извлечь их, если толькоunzip
можно извлечь более одного файла одновременно. К сожалению, это не так, поэтому вам нужно использоватьxargs -n1
либоfor
цикл:Или:
Но на самом деле,
unzip
будучи больше похожим на порт команды MS-DOS,unzip
сам по себе воспринимает свой аргумент как глобус. Другими словами,unzip 'abc*.zip'
не будет разархивирован названный файлabc*.zip
(совершенно правильное имя файла в Unix, а не в операционных системах Microsoft), но файлы, соответствующиеabc*.zip
шаблону, так что вы действительно захотите:(На самом деле наш
xargs
иfor
вышеприведенный подход был бы неправильным, потому что, если существует,abc*.zip
например, вызываемый файл , онunzip
будетbsdtar
восприниматься как шаблон! Смотрите более удобный способ извлеченияzip
архивов)Для сопоставления без
[aA][bB][cC]*.[zZ][iI][pP]
учета регистра вы бы использовали переносимость. В некоторых оболочках есть расширенные операторы globbing для сопоставления без учета регистра:zsh
:Или:
если вы хотите, чтобы эта
abc
часть была без учета регистра.ksh93
:или:
с
bash
.(нет никакого способа, чтобы там чувствовали регистр только части глобусов, кроме как с помощью переносимого синтаксиса).
с
yash
:то же самое замечание, что и
bash
выше.источник
Это, однако, завершится ошибкой, если файлов слишком много (расширение оболочки ограничено количеством аргументов, до которых она может расширяться).
Это, наверное, самый универсальный. Цитаты должны быть там. В некоторых
find
реализациях вы также можете использовать-iname
вместо-name
поиска без учета регистра (aBc<date>.ZIP
также будет соответствовать).Имейте в виду,
.*
и\.
поскольку фильтр grep использует regex, он отличается от подстановочного знака, который оболочка использует для расширения. Используйтеgrep -i
для поиска без учета регистра.источник
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
работал для меня (список архивов в родительском каталоге).Попробуйте использовать,
ls abc*.zip
чтобы сузить результаты до тех, которые соответствуют вашим критериям для начальной строки abc и окончания .zip. Звездочка расширится, чтобы соответствовать этим результатам без включения начальных символов xvz.источник
Вы должны указать каталог, где
ls
будете искать в примереэто работает для меня, но, очевидно, он не поддерживает поиск по шаблону
источник
abc
и заканчиваться на.zip
.