Digamos que eu corro,
cd /tmp/
mkdir -p foo/bar/
echo test > foo/bar/1
Agora eu tenho um muito simples
$ tree foo
foo
└── bar
└── 1
2 directories, 1 file
Agora, se eu quiser passar foo/bar
para overwrite foo
, de forma que a árvore se pareça
$ tree foo
foo
└── 1
1 directories, 1 file
Que comando posso executar? Quando eu tento mv
, eu consigo'foo/bar' and 'foo/bar' are the same file
mv foo/bar foo
mv: 'foo/bar' and 'foo/bar' are the same file
O Linux não suporta isso? Esta é uma limitação do GNU mv?
O
mv
comando assume duas formas (excluindo opções):A primeira forma só funciona se DEST não existir ou não for um diretório. Se não for um diretório, ele o exclui primeiro.
Em todos os outros casos, inclusive se o segundo parâmetro for um diretório existente ou se houver diversas fontes, presume-se que você deseja mover a(s) fonte(s) para o diretório. Se houver várias fontes e o último item não for um diretório, você receberá um erro.
Se não é isso que você deseja, verifique se DEST não existe.
configurar:
sua reestruturação desejada:
Não há como evitar isso. O comando mv não oferece suporte à substituição de diretórios.
Nenhuma invocação direta de
mv
suporte a issoPosso estar errado, mas parece impossÃvel e o UNIX System V
mv
também nunca suportou isso . Eu resolvi isso criando um tempdirmktemp
para poder excluir totalmente o diretório pai.Parece que sempre que o destino é um diretório,
mv
move a origem para o destino em vez de sobrescrever o destino. Este é um desvio darename
função subjacente em C que suporta isso. Mas a função subjacenterename
em C NÃO suporta mover uma origem para um destino se o destino for um diretório que NÃO esteja vazio, você obterá o arquivoperror
.Se você tentar.
O erro faz sentido para mim! Você está tentando mover "bar" para o diretório "foo", mas ele já está no diretório "foo".
me parece que você só queria
Basta usar:
rmdir
falhará se o diretório não estiver vazio, o que evita a remoção inadvertida de outros arquivos.