Dentro de um token que não é citado, é o seu shell que executará expansão, não o comando que você está executando.
Isso significa que, quando você insere find . -name "*.txt" -print
,
find recebe o literal *.txt
como um dos seus parâmetros e usa
esse padrão como o argumento para sua opção -name
, que corresponderá
os nomes dos arquivos encontrados antes de aplicar -print
.
Por outro lado, quando você digita find . -name *.txt -print
, o
shell transmite a versão expandida de *.txt
para localizar. Vários casos
são possíveis:
-
Não há arquivos correspondentes a
*.txt
no diretório atual: find recebe um literal*.txt
(assumindo configurações padrão de bash); -
existe exatamente um arquivo correspondente a
*.txt
no atual diretório; digamos que sejaa.txt
: find recebe esse nome de arquivo, e corresponde a todos os arquivos chamadosa.txt
encontrados a partir do atual diretório; -
vários arquivos correspondem a
*.txt
no diretório atual (isso aparece para ser o seu caso):-name
recebe o primeiro como seu parâmetro, e os outros são mais parâmetros de caminho para encontrar, que reclama sobre não receber todos os caminhos antes da expressão.
Esse é o comportamento esperado.
Vamos supor a seguinte hierarquia de arquivos:
.
├── a.txt
├── b.txt
├── c.txt
└── foo
├── a.txt
├── b.txt
└── c.txt
Os parâmetros reais encontrados no caso podem ser observados
substituindo a chamada para localizar com printf '%s\n'
, que será impressa
cada argumento expandido em sua própria linha:
$ printf '%s\n' . -name "*.txt" -print
.
-name
*.txt
-print
$ printf '%s\n' . -name *.txt -print
.
-name
a.txt
b.txt
c.txt
-print
Como você pode ver, a segunda invocação que você postou é equivalente,
dados os arquivos existentes, para find . -name a.txt b.txt c.txt -print
.