Erro mv target não é um diretório e um argumento ausente para '-exec'

0

Estou criando um script no Red Hat Enterprise Linux Server versão 7.5 (Maipo) para encontrar todos os arquivos chamados test*.txt que são 10 dias mais antigos que 6 meses. O diretório original do qual estou copiando contém um arquivo válido, no entanto, quando tento mover os arquivos, ele é danificado. O script e a mensagem de erro estão listados abaixo. Por que isso falha e o que eu posso fazer para consertar isso?

find /INTER/f/d/o/ -type f -name "test*.txt" -mtime +190 -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;

mv: target    /INTER/f/d/o/test1.txt    is not a directory
mv: target    /INTER/f/d/o/test2.txt    is not a directory
mv: target    /INTER/f/d/o/test3.txt    is not a directory
mv: target    /INTER/f/d/o/test4.txt    is not a directory

Além disso, após os arquivos terem permanecido no diretório de arquivamento por 7 meses mais 10 dias, exclua-os. Usando o script abaixo, recebo o seguinte erro.

find /INTER_ARCHIVE/f/d/o/ -type f -name "test*.txt" -mtime +400 -exec rm {};

find: missing argument to '-exec'
    
por Rascal7 26.05.2018 / 10:02

2 respostas

1

Seu primeiro comando:

find /INTER/f/d/o/ -type f -name "test*.txt" -mtime +190 -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;

Aqui, suponho que você queira mover os arquivos encontrados que correspondem ao padrão e sejam suficientemente antigos. O bit de comando mv está malformado e deve se parecer com

-exec mv {} /some/destination/path \;

Ou seja, "mova o arquivo encontrado ( {} ) para algum destino".

Não está claro ao olhar para o comando onde você quer que os arquivos sejam movidos, mas conforme você os escreveu, você está movendo os arquivos para os nomes dos caminhos encontrados. Isso falha, pois o mv tenta mover vários arquivos para algo que não é um diretório.

Em seu segundo comando,

find /INTER_ARCHIVE/f/d/o/ -type f -name "test*.txt" -mtime +400 -exec rm {};

você simplesmente não conseguiu terminar o argumento para -exec corretamente. O último bit deve se parecer com

-exec rm {} \;

ou simplesmente

-delete

se a sua implementação de find suportar isso.

Veja também " Entendendo a opção -exec de 'find' ".

    
por 26.05.2018 / 10:12
0

Seu primeiro comando:

find ... -exec mv /INTER/f/d/o/"test*.txt" /INTER_ARCHIVE/f/d/o/ {} \;

transmitirá para mv os argumentos /INTER/f/d/o/test*.txt (literalmente, com o asterisco), /INTER_ARCHIVE/f/d/o/ e, em seguida, o arquivo atual que find está processando. mv vê três argumentos, então espera mover os dois primeiros para o terceiro, que então deve ser o diretório.

O test*.txt não será expandido para nenhum nome de arquivo, pois find não executa o comando -exec através de um shell (você precisa usar -exec sh '...' \; para isso). Não que você queira, de qualquer maneira, já que globbing test*.txt aqui derrotaria o ponto de -mtime .

O que você provavelmente quer é

find ... -exec mv {} /INTER_ARCHIVE/f/d/o/ \;

para mover o arquivo find está processando atualmente para /INTER_ARCHIVE/f/d/o/ .

Ou com o GNU mv :

find ... -exec mv -t /INTER_ARCHIVE/f/d/o/ {} +

para processar vários arquivos com uma chamada para mv .

    
por 26.05.2018 / 11:40

Tags