Ao usar o comando cp para copiar vários arquivos, você pode renomear os arquivos quando copiá-los? [fechadas]

0

Eu queria saber se isso é verdadeiro ou falso.

    
por Ice 13.03.2016 / 05:36

2 respostas

6

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 .

    
por 13.03.2016 / 07:19
2

Não, cp não renomeia os arquivos copiados. Ele copia cada arquivo para um arquivo com o mesmo nome base no diretório de destino. O único caso em que cp altera o nome do arquivo é quando copia um único arquivo e especifica um nome completo em vez de um diretório como o destino.

Algumas versões do cp podem renomear o arquivo de destino já existente, se houver um.

Se você quiser renomear os arquivos conforme eles são copiados, use pax . Este é um utilitário para copiar uma árvore de diretórios ou criar ou descompactar um arquivo. É um utilitário obrigatório em sistemas POSIX, mas algumas distribuições Linux não o instalam por padrão (ele está disponível como um pacote). Com a pax, você pode renomear arquivos aplicando as instruções de s/REGEX/REPLACEMENT/ ao estilo sed.

pax -rw -pe -s/2015/2016/ source/ target/

copia arquivos como source/foo-2014.txt e source/2015.txt para target/foo-2014.txt e target/foo-2016.txt respectivamente.

    
por 14.03.2016 / 00:31