Ответы:
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"
?