find -exec não funciona em peixes

5

Enquanto uso fish como meu shell, estou tentando definir permissões em um monte de arquivos-fonte c no diretório atual com

find . -type f -name "*.c" -exec chmod 644 {} +;

Eu recebo um erro

find: missing argument to '-exec'

ou

find . -type f -name "*.c" -exec chmod 644 {} \;

Eu recebo um erro

chmod: cannot access '': No such file or directory

O que há de errado?

    
por Darc Nawg 04.08.2016 / 11:08

3 respostas

17

fish é um dos poucos shells em que esse {} precisa ser citado .

Então, com esse shell, você precisa:

find . -type f -name '*.c' -exec chmod 644 '{}' +

Quando não é citado, {} se expande para um argumento vazio, então o comando se torna o mesmo que:

find . -type f -name '*.c' -exec chmod 644 '' +

E find reclama da falta de {} (ou ; como + é reconhecido apenas como o -exec terminator ao seguir {} ).

Com a maioria dos outros shells, você não precisa das aspas em torno de {} .

    
por 04.08.2016 / 11:30
3

{ e } têm significados especiais em peixes. Eles precisam ser escapados para trabalhar com find , por exemplo:

find . -type f -name "*.c" -exec chmod 644 \{\} \;

Ou você teria que citar {} like,

find . -type f -name "*.c" -exec chmod 644 '{}' \;
    
por 04.08.2016 / 11:19
3

Seus exemplos perdem o ponto e vírgula final esperado:

find . -type f -name "*.c" -exec chmod 644 {} \;

Após revisar a pergunta, é o shell "fish". Este é um problema conhecido que pode ser trabalhado usando citações como @rahul notou. No entanto, o escape sugerido não funciona para minha configuração: aspas simples:

find . -type f -name "*.c" -exec chmod 644 '{}' \;
find . -type f -name "*.c" -exec chmod 644 '{}' +

O que faz acontecer (se alguém digitar os caracteres em vez de cortar / colar) é que ao tentar editar a linha de comando para escapar das chaves, peixe confuso e não pode prosseguir. Aqui está uma captura de tela logo após inserir as barras invertidas (não adianta tentar cortar / colar ):

e,emseguida,pressionevoltar:

Entãonão,ofishnãofuncionacomchavesdefuga.Sófingefazerisso.Continuarpressionandoenterdáumademonstraçãoconclusiva:

Leituraadicional:

por 04.08.2016 / 11:10

Tags