encontra o comando com -execdir não está lendo sinalizadores?

3

Estou tentando localizar todos os arquivos de imagem .jpg no diretório e subdiretórios atuais e movê-los para outro diretório. Eu quero que os arquivos de origem sobrescrevam os arquivos de destino, mas isso não está acontecendo. Quando eu executo meu comando, estou obtendo a seguinte saída para alguns arquivos (mas outros foram movidos):

mv: cannot move './file' to '/destination': File exists

Aqui está o comando que estou usando:

find . -iname *jpg -execdir mv -f {} \;

Parece que a opção -f (força) não está funcionando?

Quando voltei e usei mv -f ./source/file /dest em um único arquivo, ele foi substituído corretamente.

Qual é o problema? Por que o arquivo não está sendo movido?

UPDATE: O comando listado acima não é o que eu passei (suspira timidamente). O comando real fez incluir um destino (como sugerido anteriormente na resposta de @Gilles):

find . -iname '*jpg' -execdir mv -f {} /destination \;

Passei este comando novamente para ter certeza de que incluí o diretório / destination e recebi o mesmo erro:

mv: cannot move './file' to '/destination': File exists

Existe alguma resposta possível para o motivo do erro, mesmo com um diretório / destination no comando mv?

    
por Brian Dant 15.11.2011 / 01:41

1 resposta

5

O comando que você diz estar executando não corresponde à mensagem de erro que você está recebendo, mas de qualquer forma esta resposta deve esclarecer algumas coisas.

Primeiro, observe que, se houver arquivos correspondentes a *jpg no diretório atual, o padrão *jpg será expandido na linha de comando de find . Você precisa citar o padrão para se proteger disso.

Com o comando que você deu, o que é executado é algo como

cd directory && mv -f file

Mas mv espera dois argumentos: um arquivo de origem e um destino.

Você precisa passar um diretório de destino e, como está usando -execdir , o diretório de destino será interpretado em relação a cada diretório em que há .jpg arquivos. Observe que o diretório deve existir. Se você quiser mover todos os arquivos .jpg para um único diretório, crie-o primeiro e, em seguida, execute

find -iname '*.jpg' -execdir mv -f {} /common-destination-directory

Se você quiser mover todos os arquivos para um caminho relativo, por exemplo, mova-os para o subdiretório images relativo ao local onde eles estão, você precisará criar o diretório primeiro.

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -f {} images \;

Com os utilitários GNU (ou seja, no Linux), você pode otimizar um pouco executando mv apenas uma vez por diretório:

find -iname '*.jpg' -execdir mkdir -p images \; -execdir mv -t images {} +
    
por 15.11.2011 / 03:04

Tags