Como decidir se o mv é movido para um diretório em vez de substituir o diretório?

15

Digamos que eu tenha um diretório /hello .

Então eu faço mv /hello /hello2 .

Estou movendo /hello para /hello2/hello ? Ou estou movendo /hello para /hello2 ?

Parece que quando faço algo assim, obtenho resultados inconsistentes.

    
por user4951 15.01.2013 / 18:17

3 respostas

14

mv a b tenta mover a para b se b for um diretório ou um link simbólico para um diretório. Caso contrário, ele renomeará (ou copiará e excluirá em sistemas de arquivos diferentes) a to b .

Para obter um resultado consistente para mover um arquivo para um diretório, você pode fazer:

mv file dir/

ou

mv file dir/.

Se dir não existir, você receberá um erro e ele não renomeará file para dir .

Se, por outro lado, você quiser fazer um rename sem ter que se preocupar se o arquivo de destino existe como um diretório ou não, com o GNU mv, você pode fazer:

mv -T file dest

Nesse caso, file não será movido para dest se dest for um diretório. No entanto, se file e dest forem diretórios e dest estiver vazio, file será renomeado para dest (e o original dest será removido). Se ambos forem diretórios e dest não for vazio, mv -T irá reclamar.

Mesmo, se file e dest forem não diretórios (e isso inclui links simbólicos incluindo links simbólicos para diretórios), file será renomeado para dest (embora você obtenha um prompt se você não tiver permissão de gravação para dest ), e o% originaldest será removido. Há uma diferença com mv file dest no caso em que dest é um link simbólico para um diretório. Com -T , file é renomeado para dest , mas sem -T , file é movido para o diretório apontado por dest .

Então, para resumir, depois de mv -T file dest , file será renomeado para dest ou você receberá uma mensagem de erro (ou um prompt). Se o comando tiver sido bem-sucedido, o original dest , se existir antes, será removido.

    
por 15.01.2013 / 20:18
13

Isto é totalmente dependente se já existia um diretório chamado '/ hello2' já existente ou não.

Se / hello2 existe E é um diretório, então mova sempre move / hello para / hello / hello2

Se / hello2 não existir, então mova sempre renomear / hello para / hello2

Se / hello2 existir E for um arquivo, você receberá um erro, "não pode sobrescrever o diretório não 'olá2' com o diretório 'olá'.

    
por 15.01.2013 / 18:27
3

Eu tentei estes

mkdir test1
mv -v test1 test2
output:'test1' -> 'test2'
mkdir test1
mv -v test2 test1
output: 'test2' -> 'test1/test2'
touch test2
output:mv: cannot overwrite non-directory 'test2' with directory 'test1'

espero que isso explique tudo. -v é o modo detalhado.

    
por 15.01.2013 / 18:34

Tags