Ответы:
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выше.
ls 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работал для меня (список архивов в родительском каталоге).
Вы должны указать каталог, где lsбудете искать в примере
ls -la ~/file*.*
ls -la ./file*.*
это работает для меня, но, очевидно, он не поддерживает поиск по шаблону
abcи заканчиваться на .zip.
ls -1 | grep "abc$(your_date).zip"?