Por favor, explique a página man do comando mv

1

Eu entendo se eu mv foo.file boo.file , apenas renomeio foo.file para boo.file, e se eu mv dir1/foo.file dir2/boo.file , eu excluo dir1 / foo.file e faço uma cópia disso para dir2 e renomeio como boo. Arquivo. Mas eu estava olhando para a página man aqui:

NAME
     mv -- move files

SYNOPSIS
     mv [-f | -i | -n] [-v] source target
     mv [-f | -i | -n] [-v] source ... directory

DESCRIPTION
     In its first form, the mv utility renames the file named by the source
     operand to the destination path named by the target operand.  This form
     is assumed when the last operand does not name an already existing direc-
     tory.

     In its second form, mv moves each file named by a source operand to a
     destination file in the existing directory named by the directory oper-
     and.  The destination path for each operand is the pathname produced by
     the concatenation of the last operand, a slash, and the final pathname
     component of the named file.

Eu tenho duas perguntas: 1. Eu sei que "..." significa argumento que pode ser repetido, então e se eu fizer mv dir1/foo.file dir2/boo.file dir3/woo.file , o que acontece? 2. Não obtenho o segundo parágrafo sobre o segundo formulário sobre " The destination path for each operand is the pathname produced by the concatenation of the last operand, a slash, and the final pathname component of the named file. ", o que "para cada operando" e "a concatenação do último operando, uma barra e o componente de nome de caminho final do arquivo nomeado "significa?

Desculpe eu sei que são perguntas bobas

    
por RexYuan 18.02.2015 / 16:56

4 respostas

3

mv tem duas formas:

primeiro:

mv [-f | -i | -n] [-v] source target

segundo:

mv [-f | -i | -n] [-v] source ... directory

Para responder à sua primeira pergunta, no formulário segundo , você tem "...". Isso significa que você pode ter mais de uma origem, mas apenas um destino que seja especificamente um diretório para que você pode fazer isso:

mv 1.txt 2.txt 3.txt new

e ele moverá os três arquivos para um diretório criado anteriormente chamado new .

Para responder à sua segunda pergunta, ele simplesmente diz que o novo caminho para os arquivos movidos será o diretório mais o nome original do arquivo. O last operand é o diretório de destino e o final pathname é o nome dos arquivos,

    
por 18.02.2015 / 17:11
0

Se o último argumento passado para mv for um diretório existente, ele moverá o arquivo ou arquivos listados anteriormente para esse diretório. Tem que ser um diretório existente, já que, de outra forma, tentar mv de um único arquivo não seria claro se deveria mudar o nome ou mover para um novo diretório com o mesmo nome de arquivo. A linguagem na página man é um pouco mais formal e específica do que o que eu digo aqui (e mais uma explicação direta do que o código faz), em um esforço para ser exatamente preciso para qualquer pergunta sobre como mv pode funcionar para alguns caso estranho com nomes de arquivos ou diretórios incomuns.

E não, não é uma pergunta boba.

    
por 18.02.2015 / 17:11
0
  1. mv tenta mover os arquivos dir1/foo.file AND dir2/boo.file para o diretório dir3/woo.file . Isso falha, pois dir3/woo.file não é um diretório. (você pode facilmente experimentá-lo)

  2. "para cada operando" refere-se à lista de argumentos da variável (dada por ... ). Como o segundo formulário de operação é válido apenas se o último for um diretório, "a concatenação do último operando, uma barra e o componente de nome de caminho final do arquivo nomeado" significa mv apenas concatena (une) o targetDirectory (que é o último argumento) + "/" + o nome do arquivo do argumento correspondente (portanto, sem a estrutura de pastas link ). Ou seja, "o componente de nome de caminho final do arquivo nomeado" de /a/b/c é c e de b/e/r é r .

por 18.02.2015 / 17:21
0

Resumidamente:
O comando mv move e / ou renomeia arquivos e / ou diretório. Ele não os copia e exclui , a menos que o diretório de destino esteja em um sistema de arquivos diferente. (Nem todas as implementações de mv podem suportar isso.)

  1. Se file.a e file.b forem arquivos ou diretórios e c não existir ou não for um diretório ou um link para um diretório, o comando

    mv file.a file.b c
    

    vai dar um erro e nada mais:)

  2. Significa simplesmente que o comando

    mv dir1/file.a dir2/file.b C
    

    é o mesmo que escrever:

    mv dir1/file.a  C/file.a
    mv dir2/file.b  C/file.b
    

Com mais palavras:

O comando mv move (renomeia) arquivos e, pelo menos no meu sistema, tem três formulários:

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

  1. Quando você quiser mover e / ou renomear um único arquivo

    • mv file.a file.b ou mv dir.a dir.b #Simples Renomeação.
      Ele renomeia o file.a com um novo nome file.b .
      Nota: É o mesmo arquivo. Se você executar um ls -i file.a antes e ls -i file.b , você notará o mesmo número de inode . Isso significa que normalmente você não está copiando o arquivo e excluindo o antigo .
    • mv OldPath/file.a NewPath/file.a # Movendo simples
      Novamente o arquivo antes e depois tem o mesmo inode. O mesmo se você estiver movendo / renomeando um diretório.
    • mv OldPath/file.a NewPath/file.b # Mover e renomear
      Move e renomeia o arquivo do OldPath para o NewPath. Novamente o arquivo antes e depois tem o mesmo inode. O mesmo se você estiver movendo / renomeando um diretório.
  2. Quando você deseja mover muitos arquivos para um diretório de destino. Por exemplo.

    mv dir1/file1 dir2/file2 ... /long/path/to/dir     
    

    é como escrever:

    mv dir1/file1 /long/path/to/dir/file1
    mv dir2/file2 /long/path/to/dir/file2
    
  3. Você especifica -t e o diretório de destino antes da lista do arquivo a ser movido.
    Por exemplo. mv -t /long/path/to/dir file1 file2 ...

    -t, --target-directory=DIRECTORY
    move all SOURCE arguments into DIRECTORY

BTW Nenhuma pergunta é uma pergunta boba, apenas as respostas podem ser bobas :-)

    
por 18.02.2015 / 18:56