Como eu corrijo um diretório incorretamente copiado em si mesmo?

3

Dada a seguinte situação ...

<path>/mydir1/mydir2

... onde mydir2 deve ter substituído mydir1, mas foi colocado dentro, e ambos os diretórios possuem o mesmo nome de arquivo. Como isso é fixo?

A tentativa de fazer mv <path>/mydir/mydir/* <path>/mydir/ ou mv <path>/mydir <path>/ resulta em:

mv: cannot move '<path>/mydir/mydir' to a subdirectory of itself, '<path>/mydir'

Isso parece estupidamente simples, mas é tarde aqui e eu não consigo entender.

Existem dezessete diretórios para consertar (o caminho difere para cada um, mas o mesmo nome mydir).


Para confirmar, a mensagem de erro pode ser causada por isso:

# cd /path/to/directory
# mv mydir/mydir ./
mv: cannot move 'mydir/mydir' to a subdirectory of itself, './mydir'

Também tentei:

# mv mydir/mydir/* mydir/
mv: cannot move 'mydir/mydir/otherdir1' to a subdirectory of itself, 'mydir/otherdir1'
mv: cannot move 'mydir/mydir/otherdir2' to a subdirectory of itself, 'mydir/otherdir2'

e ...

# mv /path/to/directory/mydir/mydir/otherdir1 /path/to/directory/mydir/
mv: cannot move '/path/to/directory/mydir/mydir/otherdir1' to a subdirectory of itself, '/path/to/directory/mydir/otherdir1'

e usando um diretório temporário:

# mv mydir/mydir ./mydir-temp
# mv mydir-temp/* mydir/
mv: cannot move 'mydir-temp/otherdir1' to a subdirectory of itself, 'mydir/otherdir1'
mv: cannot move 'mydir-temp/otherdir2' to a subdirectory of itself, 'mydir/otherdir2'


Eu encontrei uma pergunta semelhante " Como recursivamente mover todos os arquivos (incluindo ocultos) em uma subpasta para uma pasta pai em * nix? ", o que sugeriu que mv bar/{,.}* . faria isso.

Mas isso também gera os mesmos erros, além de confundir os . e .. de algum lugar.

# cd mydir
# mv mydir/{,.}* .
mv: cannot move 'mydir/otherdir1' to a subdirectory of itself, './otherdir1'
mv: cannot move 'mydir/otherdir2' to a subdirectory of itself, './otherdir2'
mv: cannot move 'mydir/.' to './.': Device or resource busy
mv: cannot move 'mydir/..' to './..': Device or resource busy
mv: overwrite './.file'? y


Outra pergunta semelhante " estranheza do comando do linux mv " sugere que mv não sobrescrever e uma cópia é necessária.

# cd mydir
# cp -rf ./mydir/* ./
cp: overwrite './otherdir1/file1'? y
cp: overwrite './otherdir1/file2'? y
cp: overwrite './otherdir1/file3'?

Isso parece estar funcionando ... exceto que há muitos arquivos (e dirs) - não quero confirmar todos! O f não deveria impedir isso?

Ok, então cp foi aliado para cp -i (que eu descobri com type cp ) e ignorado usando \cp -rf ./mydir/* ./ que parece ter funcionado.

Embora eu tenha resolvido o problema de obter dirs / arquivos de um lugar para outro, ainda estou curioso sobre o que está acontecendo com o mv stuff - isso é realmente um recurso deliberado como sugerido pela Warner ?

    
por Peter Boughton 15.12.2010 / 01:52

2 respostas

1

Primeiro, mova o novo diretório para fora (com um nome temporário para evitar conflito), exclua o diretório original e renomeie o novo diretório para o lugar. Nota: porque isso envolverá a exclusão de itens em massa, pense cuidadosamente antes de executar esses comandos e certifique-se de ter um backup primeiro. Além disso, eu escrevi isso com && s entre os comandos, então se um falhar, o resto não será executado - bom em um script, mas se você estiver fazendo isso manualmente, provavelmente é melhor digitá-los sequencialmente, preste atenção e pare se algo der errado.

mv <path>/mydir/mydir <path>/mydir-temp &&
rm -R <path>/mydir &&
mv <path>/mydir-temp <path>/mydir
    
por 15.12.2010 / 02:41
0

A melhor maneira de fazer isso é:

for d in 'ls -A'; do if [ "$d" != "TTT" ]; then cp -Rf $d TTT; fi; done

copia todos os diretórios do diretório atual recursivamente no diretório TTT, exceto o próprio TTT. A opção -A in ls permite considerar todos os diretórios e arquivos ocultos, mas não considera arquivos especiais. e .. e condição "$d" != "TTT" excluir diretório TTT para evitar copiar. Você pode escrever bash script com 2 argumentos salvar em local ou sistema bin e usá-lo quando necessário.

    
por 09.11.2012 / 10:32