O padrão de globbing do nome do arquivo padrão para corresponder a um dígito é [0-9]
. Isso corresponde a um único dígito:
cat file[0-9].txt
Para selecionar apenas dois deles:
cat file[25].txt
Para números maiores que 9, a expansão de braçadeira será útil (mas veja a nota abaixo para saber a diferença entre padrões de globbing e expansões de braçadeira):
cat file{25..60}.txt
Mais uma vez, a expansão de chaves também permite números individuais:
cat file{12,45,900,xyz}.txt
(observe que no exemplo acima, a expansão de chave não envolve um loop aritmético, mas gera apenas nomes com base nas cadeias fornecidas).
Em bash
, com a extglob
opção de shell ativada ( shopt -s extglob
), o seguinte também funcionará:
cat file@(12|45|490|foo).txt
O @(...)
padrão corresponderá a qualquer um dos |
padrões delimitados incluídos .
A diferença entre os padrões de englobamento como [...]
e @(...)
e expansões cinta, é que uma expansão cinta é gerado na linha de comando e não pode realmente encontrou nenhum nomes existentes no diretório atual. Um padrão globbing de nome de arquivo corresponderá a nomes, mas o shell não reclamará se nem todo o nome possível existir. Se não existir um nome correspondente, o padrão permanecerá sem expansão, a menos que também nullglob
seja definida a opção shell, nesse caso o padrão será removido.
Exemplo:
touch file1
ls file[0-9]
Aqui, apenas a lista de arquivos file1
será exibida.
Com ls file{0..9}
, ls
iria reclamar por não encontrar file0
, file2
etc.
No exemplo a seguir, o primeiro comando tocará apenas nos nomes existentes que correspondem ao padrão especificado, enquanto a segunda linha criará arquivos que ainda não existem:
touch file[0-9]
touch file{0..9}
file45.txt
. A expressão entre colchetes[...]
funciona exatamente como na expressão regular, mas é usada!
no lugar de^
para dizer "not in". Um[...]
padrão sempre corresponderá a um único caractere.{1,2}
também não é compatível com POSIX ... aprendi algumas coisas novas hoje!grep
, gerar URLs para passarcurl
e assim por diante ... mas também pode ser confuso para pessoas acostumadas a trabalhar com globs.A sintaxe a ser usada é a
file{1,2}
que avaliará parafile1
efile2
.Como Inian também apontou abaixo ... seria mais fácil fazer
touch file{1..9}
neste caso de exemplo ...Você também pode usar várias expressões, como:
Sim, o acima criará 234 arquivos (
9
vezes26
).fonte
file{1,2}
sintaxe também é conveniente para renomear arquivos:mv some_very_long_filename.txt{,.bak}
Sim, você pode usar a expansão de chaves no
bash
shell. Para apenas alguns arquivos, basta fazerfile{1..2}
ou apenasfile{1,2}
Ou se você estiver preocupado com a falta de arquivos em alguns casos, basta fazer um loop simples,
Ou, se apenas concatenar é sua única operação nos arquivos e se você não tiver certeza de que arquivos não poderiam estar presentes em nenhum momento, apenas
cat
eles e suprima os erros. Redirecionar o erro padrão para/dev/null
suprimir os erros se o arquivo não estiver disponível.ou use a expressão glob
file[15]
que não reclama dos erros se o arquivo não foi encontrado.fonte
file{1,5}
sintaxe da vírgula era tudo o que estava faltando!