cp
pode copiar um único arquivo para um nome de arquivo diferente (por exemplo, "renomear" o destino), mas não é possível especificar nomes de arquivos diferentes para vários arquivos. Portanto, a resposta é não, cp
não pode renomear ao copiar vários arquivos.
Quando cp
recebe mais de dois argumentos, todos os arquivos são copiados para o argumento final (um diretório). por exemplo. cp file1 file2 file3 /path/to/destdir/
Com o GNU cp
, há uma opção -t
ou --target-directory
que permite especificar o destino antes dos arquivos de origem. por exemplo. cp -t /path/to/destdir/ file1 file2 file3
-t
é particularmente útil quando usado com, por exemplo, ... | xargs cp -t destdir/
ou find ... -exec cp -t destdir/ {} +
.
Algumas outras ferramentas GNU, incluindo mv
e ln
, também têm a mesma opção -t
aka --target-directory
.
Se você quiser renomear vários arquivos ao copiá-los, a maneira mais fácil é escrever um script para fazê-lo.
Você pode gerar uma grande parte do script automaticamente. Existem muitos métodos para fazer isso, eis um dos mais fáceis (usando nomes de arquivos correspondentes a *.txt
como exemplo):
find . -maxdepth 1 -name '*.txt' \
-exec echo cp \'{}\' \'/path/to/dest/newfile\' \; > mycp.sh
(Eu dividi o comando file
em duas linhas aqui para evitar uma barra de rolagem horizontal, mas isso pode ser digitado em uma linha)
Isso produzirá resultados assim:
$ ls -1 *.txt
dict.txt
qstat.txt
x.txt
foo'bar.txt
$ find . . -maxdepth 1 -name '*.txt' \
-exec echo cp \'{}\' \'/path/to/dest/newfile\' \;
cp './qstat.txt' '/path/to/dest/newfile'
cp './x.txt' '/path/to/dest/newfile'
cp './dict.txt' '/path/to/dest/newfile'
cp './foo'bar.txt' '/path/to/dest/newfile'
Em seguida, edite mycp.sh
com seu editor de texto preferido e altere newfile
em cada linha de comando cp
para o nome ao qual deseja renomear o arquivo copiado. Se você não quiser renomear alguns dos arquivos, apenas exclua newfile
do destino, deixando apenas o caminho como o destino.
Observe a linha final da saída, com './foo'bar.txt'
como o nome do arquivo de origem - porque o nome do arquivo contém um caractere '
, essa linha precisa de alguma edição extra para alterar o '
para '\''
incorporado, a linha é assim:
cp './foo'\''bar.txt' '/path/to/dest/newfile'
Como alternativa, se você tiver o GNU sed
(com a opção -z
ou --null-data
para linhas separadas por NUL) e xargs
, poderá fazer isso automaticamente com:
find . -maxdepth 1 -name '*.txt' -print0 |
sed -z -e "s/'/'\\''/g" |
xargs -0 -r -i echo cp \'{}\' \'/path/to/dest/newfile\' > mycp.sh
Quando terminar de editar o script, você poderá executá-lo com sh mycp.sh
.