linux linha de comando localiza ponto de interrogação de escape

4

Por algum motivo, gostaria de excluir todos os nomes de arquivos como "* .jpg?" (o nome do arquivo está terminando com um real?)

Eu tentei isso

find /var/www/ -type f -name "*.jpg\?"

e

find /var/www/ -type f -name "*.jpg?"

mas isso não funciona como posso fazer isso?

    
por Bouki 04.02.2014 / 13:55

2 respostas

5

Curiosamente, ambos os seus comandos funcionam no sistema do CentOS 6.5 find 4.4.2 que tenho de entregar. Você pode tentar usar aspas simples '

find /var/www/ -type f -name '*.jpg?'

Se isso funcionar e estiver disponível em sua localização, você poderá usar o argumento -delete para localizar a exclusão dos arquivos. Isso elimina a necessidade de xargs e print0 e similares. Certifique-se de garantir que o comando find funcione corretamente antes de adicionar a exclusão.

    
por 04.02.2014 / 14:04
2

Resposta curta:

find /var/www -type f -name '*.jpg\?'

Explicação:

? tem um significado especial em mais conchas . É o caractere curinga de "caractere único".

Em um shell, isso significa que ele se expandirá para qualquer caractere, da mesma forma que * se expande para qualquer string:

> echo *
1file 2file dir1 dir2 file1 file2
> echo ?
?
> echo file?
file1 file2

Tenha em mente que esses caracteres especiais serão expandidos pelo seu shell, não pelo comando para o qual você está passando como argumentos.

No caso específico de find , find também aceita curingas. Assim, você tem para escapar deles no shell para encontrar para recebê-los.

Deixe-me esclarecer isso com outro exemplo:

> echo *
dir1 file1 file2
> find dir1 -name *
find: paths must precede expression: file1
> find dir1 -name \*
dir1
dir1/test1
dir1/test2
> find dir1 -name '*'
dir1
dir1/test1
dir1/test2

Se eu não escapar do * , find receberá a mesma string que o echo mostrou, em vez do *

Como você pode ver, você pode escapar de caracteres especiais com barra invertida ou cercá-los com ' aspas simples. Eu prefiro aspas simples por muitas razões. (Observe que isso se aplica a bash, dash e talvez outros, mas provavelmente não a todos).

Agora você escapou do ? do shell, mas não do find. Isso geralmente não causará problemas, mas poderá ocorrer, por exemplo, se você tiver um arquivo file.jpga que não deseja excluir:

> find . -type f -name '*.jpg?'
./file1.jpg?
./file2.jpga
> find . -type f -name '*.jpg\?'
./file1.jpg?

Outra opção seria find . -type f -name \*.jpg\\? ... agora você vê porque prefiro aspas simples.

    
por 04.02.2014 / 20:48

Tags