Por que não encontra arquivos de lista em subdiretórios? [duplicado]

5

Estou tentando encontrar todos os arquivos javascript nos subdiretórios do meu projeto.

A árvore de trabalho é a seguinte:

.
├── app
├── assets
├── components
├── email.txt
├── gulpfile.js
├── node_modules
└── package.json

Para esse fim eu digo:

find . -name *.js

ou

find . -path *.js

Estranhamente, o primeiro comando reporta apenas gulpfile.js , enquanto o segundo informa nada. Mas eu tenho .js arquivos em app , components e node_modules ! Por que eles não apareceriam?

    
por Boris Burkov 06.02.2017 / 02:00

2 respostas

8

Coloque aspas simples em torno de *.js . Sem aspas, o shell está expandindo o caractere curinga para nomes de arquivos que correspondem ao diretório atual, portanto, find obtém apenas esses nomes de arquivos, no diretório atual ou nos subdiretórios da especificação de localização (mas nunca vê o caractere curinga). Para especificá-lo como um padrão para o find usar, é necessário evitar a expansão do shell. '*.js' faz isso.

    
por 06.02.2017 / 02:09
2

É fácil esquecer que a globalização de conchas ainda desempenha um papel no processo. Assim, você precisa de uma maneira de informar ao shell para evitar a expansão de * para uma lista de arquivos. Uma maneira é através do que Chris Johnson mencionou - citando.

Outra é através do escape do caractere * , como em

find . -iname \*.js

Compare:

$ strace -e trace=execve find -maxdept 1 -iname *.js > /dev/null                                      
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "file1.js", "file2.js"], [/* 75 vars */]) = 0
find: unknown predicate '-maxdept'
+++ exited with 1 +++

$ strace -e trace=execve find -maxdept 1 -iname \*.js > /dev/null                                     
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate '-maxdept'
+++ exited with 1 +++

No primeiro caso, vemos que * foi expandido para a lista de arquivos file1.js e file2.js que estão presentes no diretório de trabalho atual. No segundo exemplo - o * é tratado como argumento literal para find . De fato, este é o mesmo resultado produzido citando o argumento:

$ strace -e trace=execve find -maxdept 1 -iname '*.js' > /dev/null                                    
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate '-maxdept'
+++ exited with 1 +++

Como alternativa, você pode usar o valor octal de * .

$ strace -e trace=execve find -maxdept 1 -iname $''.js > /dev/null                                 
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate '-maxdept'
+++ exited with 1 +++
    
por 06.02.2017 / 06:03

Tags