man find
:
-f caminho: Adicione o caminho à lista de caminhos que serão recorrentes. Isto é útil quando o caminho começa com um caractere que de outra forma seria interpretado como uma expressão, ou seja, “!” , "(" e "-".
Mas por que
find ./test-folder -type f -name '*.txt'
funciona, enquanto
find -f ./test-folder -type f -name '*.txt'
não funciona?
Qual é o erro então?
./test-folder: illegal option -- t
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
Vamos mudar um pouco o comando e ver o que acontece:
Não sei por que isso imprimiria o caminho fornecido na mensagem de erro, mas, fora isso, está claro que é o seguinte
-t
que produz o erro. Isso ocorre porque o-type
argumento é considerado uma abreviação para options-t
,-y
,-p
, and-e
, da mesma forma que algo comols -l -aR
tem as três opções-l
,-a
, and-R
, e não apenas a opção-l
e o nome do arquivo-aR
. Agora,find
não tem-t
opção, então reclama.-H
funciona, como acima, e clarofind -f . -depth
reclamaria da carta de opçãoe
.Você precisa encerrar a lista de opções com
--
para que os argumentos subsequentes sejam considerados não opções. É o mesmofind
com outras ferramentas, por exemplo:ou se você quiser listar um arquivo chamado
-aR
:É claro que, com outras ferramentas, o problema está principalmente em coisas como
ls *.txt
onde um nome de arquivo começa-
pode ser um problema. Raramente se usa globs comfind
, mas a ideia é a mesma.Assim como acontece com outras ferramentas, normalmente não é necessário
--
withfind
, desde que o caminho fornecido como a primeira não opção seja "legal", por exemplo.
. Um argumento que não começa com um travessão encerra implicitamente o processamento de opções. Mas você poderia usar--
:Claro que você também pode usar um glob com find, por exemplo, algo como
find -- *.d -name "*.conf"
. Não que isso--
ajude, já que um nome começando com um travessão (-foo.d
) pode agora ser considerado um predicado inválido.E claro, se a expressão começar com algo que não se parece com uma opção (
(
ou!
), isso também interrompe o processamento da opção, como no comando mencionado nos comentários:Isso também não ajuda se o nome de um arquivo começar com um travessão, é por isso que eles têm essa
-f
opção. Ou você pode sempre prefixar o nome do arquivo com./
, afetando a saída de forma semelhante. Como um bônus adicional, isso também funcionaria com um glob, por exemplo./*.d
.Observe que o GNU find é diferente aqui, ele tenta interpretar opções desconhecidas como predicados:
mas é claro que isso ocorre porque não é necessário fornecer explicitamente um caminho para a pesquisa, mas o padrão é
.
se nenhum for fornecido. Por exemplo, estes são os mesmos:Ele também não lida com opções empilhadas, embora isso provavelmente seja bom, já que muitas vezes não se usa mais de uma com find (as opções
-H
,-L
e-P
controlam o tratamento de links simbólicos e substituem umas às outras, enquanto-O
e-D
são para otimização e depuração ):Não parece possível dar ao GNU find algo como
-type
um nome de arquivo na linha de comando. Você terá que usar./-type
ou passar os nomes dos arquivos-files0-from
.Use
--
para encerrar a lista de caminhos de pesquisa, antes de especificar qualquerfind
expressão:Geralmente
--
sinaliza o fim das opções, e o macOSfind
usa isso em conjunto com a-f
opção para sinalizar o fim dos caminhos de pesquisa. Isso é mencionado na seção "BUGS" dofind(1)
manual do macOS (ênfase minha):