Quando você emite o comando:
mv *.txt *.tsv
o shell, vamos assumir o bash, expande os curingas se houver arquivos correspondentes (incluindo diretórios). A lista de arquivos é passada para o programa, aqui mv
. Se nenhuma correspondência for encontrada, a versão não expandida é passada.
Novamente: o shell expande os padrões, não o programa.
Muitos exemplos talvez sejam o melhor caminho, então aqui vamos nós:
Exemplo 1:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Agora, o que acontece na linha mv
é que o shell expande *.txt
para os arquivos correspondentes. Como não há arquivos *.tsv
que não sejam alterados.
O comando mv
é chamado com dois argumentos especiais :
-
argc
: Número de argumentos, incluindo o programa. -
argv
: Uma matriz de argumentos, incluindo o programa como primeira entrada.
No exemplo acima, seria:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
O programa mv
verifica se o último argumento, *.tsv
, é um diretório. Como não é, o programa não pode continuar, pois não é projetado para concatenar arquivos. (Normalmente, mova todos os arquivos em um.) Nem crie diretórios por capricho.
Como resultado, ele aborta e relata o erro:
mv: target ‘*.tsv’ is not a directory
Exemplo 2:
Agora, se você disser:
$ mv *1.txt *.tsv
O comando mv
é executado com:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Agora, novamente, mv
verifique se *.tsv
existe. Como isso não acontece, o arquivo file1.txt
é movido para *.tsv
. Ou seja: o arquivo é renomeado para *.tsv
com o asterisco e tudo.
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
Exemplo 3:
Se você disser:
$ mkdir *.tsv
$ mv *.txt *.tsv
O comando mv
é executado com:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Como *.tsv
agora é um diretório, os arquivos acabam sendo movidos para lá.
Agora: usando comandos como some_command *.tsv
quando a intenção é manter o caractere curinga, é sempre necessário citá-lo. Ao fazer citações, você evita que os curingas sejam expandidos, se houver alguma correspondência. Por exemplo. diga mkdir "*.tsv"
.
Exemplo 4:
A expansão pode ainda ser visualizada se você fizer, por exemplo:
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
Exemplo 5:
Agora: o comando mv
pode e funciona em vários arquivos. Mas se houver mais de dois, o último deve ser um diretório de destino. (Opcionalmente você pode usar a opção -t TARGET_DIR
, pelo menos para o GNU mv.)
Então está tudo bem:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
Aqui mv
seria chamado com:
argc = 7
argv[0] = mv
argv[1] = b1.tsv
argv[2] = b2.tsv
argv[3] = f1.txt
argv[4] = f2.txt
argv[5] = f3.txt
argv[6] = foo
e todos os arquivos acabam no diretório foo
.
Quanto aos seus links. Você forneceu um (em um comentário), onde mv
não é mencionado, mas rename
. Se você tiver mais links, você pode compartilhar. Bem como para man pages onde você afirma que isso é expresso.