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.
mv
com arquivos, faz a mesma coisa. Apenas renomear.masmv
com diretórios Não é bom excluir o diretório inteiro com o subdiretório por causa de ummv
comando que não é seguro. então é movido comotest1/test2
. mas se você ainda deseja obtê-lo, escreva umalias
que verifique se o parâmetro fornecido é diretório e, em seguida, rm -rf o diretório e use omv
comando, mas use-o por sua conta e risco./hello
e/hello2
são diretórios, então eu tenho notado quecp /hello /hello2
é o que é inconsistente. Dependendo do que combinação de barras à direita estão lá, às vezes o conteúdo de/hello
são copiados/hello2
, e às vezes o próprio diretório é copiado no.Respostas:
mv a b
tenta movera
parab
seb
é 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)a
comob
.Para obter um resultado consistente para mover um arquivo para um diretório, você pode:
ou
Se
dir
não existir, você receberá um erro e ele não será renomeadofile
paradir
.Se, por outro lado, você quiser fazer um
rename
sem se preocupar se o arquivo de destino existe como um diretório ou não, com o GNU mv, você pode:Nesse caso,
file
não será movido paradest
sedest
for um diretório. No entanto, se ambosfile
edest
são diretórios edest
estiverem vazios,file
será renomeado paradest
(e o originaldest
removido). Se os dois forem diretórios edest
não estiverem vazios, elesmv -T
irão reclamar.Mesmo, se
file
edest
são não diretórios (e que inclui links simbólicos incluindo links simbólicos para diretórios),file
será renomeado paradest
(embora você receberá um aviso se você não tem permissão de escritadest
), eo originaldest
será removido. Há uma diferençamv file dest
no caso em quedest
há um link simbólico para um diretório. Com-T
,file
é renomeado paradest
, mas sem-T
,file
é movido para o diretório apontado pordest
.Então, para resumir, depois
mv -T file dest
, qualquerfile
um terá sido renomeado paradest
ou você receberá uma mensagem de erro (ou um prompt). Se o comando for bem-sucedido, o originaldest
, se existir anteriormente, será removido.fonte
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'.
fonte
Eu tentei isso
Espero que isso explique tudo.
-v
é o modo detalhado.fonte