Obtendo a opção -exec em find to work

5

Estou tentando fazer com que find imprima uma lista de diretórios que contenham arquivos diferentes de imagens jpg, mas acho que meu uso da opção -exec está quebrado. Meu ambiente é o Cygwin Bash.

$ find ! -iname "*.JPG$" -exec dirname

find: missing argument to '-exec'
$ find ! -iname "*.JPG$" -exec dirname {}

find: missing argument to '-exec'
$ find ! -iname "*.JPG$" -exec dirname;

find: missing argument to '-exec'
$ find ! -iname "*.JPG$" -exec dirname ;

find: missing argument to '-exec'
$ find ! -iname "*.JPG$" -exec dirname {};

find: missing argument to '-exec'
    
por id0 07.01.2015 / 04:17

3 respostas

8

Um -exec precisa ser finalizado com ; ou + . O ; faz com que o comando seja executado uma vez por nome de arquivo encontrado, enquanto + faz com que o comando seja executado uma vez para todos os nomes de arquivos.

Aqui está um exemplo de trabalho:

find ! -iname "*.JPG" -exec dirname {} \;

Algumas diferenças notáveis de suas tentativas:

  1. Deve haver um espaço entre {} e \;
  2. O ; deve ter escape, porque é um metacaractere do shell.
  3. Como @muru apontou em sua resposta, -iname usa glob, não regex
por 07.01.2015 / 04:22
4

Tente:

find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u

Notas;

  • Para completar o comando -exec , é necessário um {} para mostrar onde o nome do arquivo deve ser e um ponto-e-vírgula é necessário. Porque a casca iria comer um ponto-e-vírgula simples, nós temos que escapar para que ela seja passada para find .

  • -iname corresponde a globs, não a expressões regulares. Portanto, o% final $ em "*.JPG$" provavelmente não é o que você deseja.

  • Você disse que deseja uma "lista de diretórios que contenha arquivos diferentes de jpgs". Conseqüentemente, adicionei -type f para termos a certeza de que apenas analisamos os diretórios que contêm pelo menos um arquivo.

  • Os resultados são colocados em sort -u para remover duplicatas.

por 07.01.2015 / 04:28
3

A sintaxe:

-exec [command] ... {} ... ;
-exec [command] ... {} ... +

Como ; faz parte da sintaxe do shell, você precisa escapar para que find o veja como um argumento:

find .. -exec dirname {} \;

A propósito, -iname não usa expressões regulares - apenas use *.jpg sem o $ .

Parece-me agora que, com o GNU, não precisamos usar dirname . Em vez disso:

find ... -printf "%h\n"
    
por 07.01.2015 / 04:21

Tags