Find não quer encontrar * .sh em certo nível [duplicado]

1

Eu tenho um problema com find . Não encontra arquivos * .sh se eu estiver em determinado nível de diretório. No entanto, ele encontra arquivos * .sql.

/path$ cd do_not_upload/updates/1.1.1/
/path/do_not_upload/updates/1.1.1$ find . -path *.sh
./run_pre_update/002.sh
./run_pre_update/001.sh
./run_post_update/001.sh
/path/do_not_upload/updates/1.1.1$ find . -path *.sh
./run_pre_update/002.sh
./run_pre_update/001.sh
./run_post_update/001.sh
/path/do_not_upload/updates/1.1.1$ cd ..
/path/do_not_upload/updates$ find . -path *.sh
./1.1.3/run_pre_update/002.sh
./1.1.3/run_pre_update/001.sh
./1.1.3/run_post_update/001.sh
./1.1.1/run_pre_update/002.sh
./1.1.1/run_pre_update/001.sh
./1.1.1/run_post_update/001.sh
/path/do_not_upload/updates$ cd ..
/path/do_not_upload$ find . -path *.sh
./updates/1.1.3/run_pre_update/002.sh
./updates/1.1.3/run_pre_update/001.sh
./updates/1.1.3/run_post_update/001.sh
./updates/1.1.1/run_pre_update/002.sh
./updates/1.1.1/run_pre_update/001.sh
./updates/1.1.1/run_post_update/001.sh
/path/do_not_upload$ cd ..
/path$ find . -path *.sh
/path$ find . -path *.sql
./do_not_upload/updates/1.1.3/sql_migrations/002.sql
./do_not_upload/updates/1.1.3/sql_migrations/001.sql
./do_not_upload/updates/1.1.1/sql_migrations/002.sql
./do_not_upload/updates/1.1.1/sql_migrations/001.sql

$ find --version
find (GNU findutils) 4.4.2

/path$ stat do_not_upload/
  File: ‘do_not_upload/’
  Size: 60          Blocks: 0          IO Block: 4096   directory
Device: 14h/20d Inode: 159862      Links: 3
Access: (0775/drwxrwxr-x)  Uid: ( 1000/  jorgee)   Gid: ( 1000/  jorgee)
Access: 2014-09-10 14:02:34.449376973 -0300
Modify: 2014-09-10 13:54:13.805363567 -0300
Change: 2014-09-10 13:54:13.805363567 -0300
 Birth: -
    
por JorgeeFG 10.09.2014 / 21:35

2 respostas

3

Em sistemas semelhantes a Unix, *.sh é uma expressão glob que é expandida pelo shell e os resultados são passados como argumentos para o programa que está sendo chamado. Se e somente se não houver arquivos correspondentes, a expressão glob será passada como está. Você deve ter o hábito de citar curingas se quiser que eles sejam passados para o programa que você está executando.

Como exemplo, se você executasse find . -path *.sh de /path/do_not_upload/updates/1.1.1/run_pre_update/ , o comando real que está sendo executado seria find . -path 001.sh 002.sh , o que quase certamente não é o que você deseja.

Observe que isso é diferente do MS-DOS e dos sistemas relacionados, em que a expansão glob é feita (ou não) pelo programa que está sendo chamado.

Para evitar expansões de shell, inclua o argumento em aspas duplas ou até mesmo simples - que o transmitirá ao programa chamado textualmente e, assim, deixe find fazer suas próprias expansões:

$ find . -path '*.sh'
    
por 10.09.2014 / 23:08
1

Isso é basicamente uma duplicata da pergunta , mas o motivo pelo qual você não obtém nenhuma saída é um pouco diferente.

Com -path , o argumento deve corresponder ao caminho inteiro (incluindo o argumento da linha de comando). Quando foo.sh existe no diretório atual, você está executando

find . -path foo.sh

Como foo.sh não corresponde a ./foo.sh , você não recebe resultado.

A solução é a mesma que a questão vinculada: cite seus curingas se você não quiser que o shell os expanda.

    
por 10.09.2014 / 23:03