Como decidir que o mv se move para um diretório em vez de substituí-lo?


18

Digamos que eu tenho um diretório /hello.

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

Eu estou movendo-se /helloem /hello2/hello? Ou estou indo /hellopara /hello2?

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


11
Em que caso o resultado é inconsistente? Parece que sempre que o diretório de destino existe, ele se move para o diretório de destino, caso contrário, ele é renomeado.
jmathew

Isso é inconsistente. O mesmo comando deve fazer a mesma coisa. Isso significa que o comando é ambíguo.
usar o seguinte comando

Isso não é realmente inconsistente porque age de forma consistente dentro do contexto. Embora eu possa ver como é confuso, mas quanto mais penso nisso, o comando deve ser assim para funcionar em todos os cenários.
jmathew

Eu prefiro dizer que é assim que ele é projetado e também é lógico ... se você usar mvcom arquivos, faz a mesma coisa. Apenas renomear.mas mvcom diretórios Não é bom excluir o diretório inteiro com o subdiretório por causa de um mvcomando que não é seguro. então é movido como test1/test2. mas se você ainda deseja obtê-lo, escreva um aliasque verifique se o parâmetro fornecido é diretório e, em seguida, rm -rf o diretório e use o mvcomando, mas use-o por sua conta e risco.
harish.venkat

Suspeito que seu exemplo se baseie na lembrança de algo que aconteceu no passado, com base em "Parece que faço algo assim". Se ambos /helloe /hello2são diretórios, então eu tenho notado que cp /hello /hello2é o que é inconsistente. Dependendo do que combinação de barras à direita estão lá, às vezes o conteúdo de /hellosão copiados /hello2, e às vezes o próprio diretório é copiado no.
Izkata

Respostas:


16

mv a btenta mover apara bse bé um diretório ou um link simbólico para um diretório. Caso contrário, ele renomeará (ou copiará e excluirá se estiver em sistemas de arquivos diferentes) acomo b.

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

mv file dir/

ou

mv file dir/.

Se dirnão existir, você receberá um erro e ele não será renomeado filepara dir.

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

mv -T file dest

Nesse caso, filenão será movido para destse destfor um diretório. No entanto, se ambos filee destsão diretórios e destestiverem vazios, fileserá renomeado para dest(e o original destremovido). Se os dois forem diretórios e destnão estiverem vazios, eles mv -Tirão reclamar.

Mesmo, se filee destsão não diretórios (e que inclui links simbólicos incluindo links simbólicos para diretórios), fileserá renomeado para dest(embora você receberá um aviso se você não tem permissão de escrita dest), eo original destserá removido. Há uma diferença mv file destno caso em que desthá 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 mv -T file dest, qualquer fileum terá sido renomeado para destou você receberá uma mensagem de erro (ou um prompt). Se o comando for bem-sucedido, o original dest, se existir anteriormente, será removido.


14

Isso depende totalmente se já existe um diretório chamado '/ hello2' ou já existe.

Se / hello2 existir AND for um diretório, a movimentação sempre moverá / hello para / hello / hello2

Se / hello2 não existir, a movimentação sempre renomeará / hello para / hello2

Se / hello2 existir E for um arquivo, você receberá um erro ", não será possível sobrescrever o diretório 'hello2' pelo diretório 'hello'.


3

Eu tentei isso

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.