copia dois arquivos por vez

5

O que fazer se eu quiser copiar dois arquivos de cada vez usando o comando? Digamos que eu tenha uma pasta chamada ABC e os arquivos sejam

mno.txt
xyz.txt
abcd.txt
qwe.txt and so on (100 no. of files)

Agora quero cp mno.txt e xyz.txt de cada vez. Como posso fazer isso?

    
por Avani badheka 18.10.2016 / 08:47

3 respostas

13

Supondo que você queira cp arquivos em um diretório, você pode usar a sintaxe usual para cp :

cp mno.txt xyz.txt destination_directory

Ou use a expansão de contraventamento para brevidade:

cp {mno,xyz}.txt destination_directory

Por motivos de clareza, é melhor usar a opção -t ( --target-directory ) de cp , isso é GNU-ism:

cp -t destination_directory {mno,xyz}.txt

Apenas para observar, se você quiser cp do conteúdo de vários arquivos com uma só vez de cp , não será possível. cp lida com um arquivo por vez ao copiar o conteúdo de um arquivo para outro.

    
por heemayl 18.10.2016 / 08:53
3

Use a sintaxe cp -t destination_dir/ file1 file2 .

Exemplo:

bash-4.3$ ls dir1
file1  file2  file3
bash-4.3$ ls dir2/
bash-4.3$ cp -t dir2/  dir1/file1 dir1/file2
bash-4.3$ ls dir2
file1  file2

Além da resposta original.

Os usos que gostam de brincar com python, podem estar interessados no seguinte script, que permite copiar um número arbitrário de arquivos especificados na linha de comando, com o último argumento sendo o destino.

Demo:

bash-4.3$ ls dir1
file1  file2  file3
bash-4.3$ ls dir2
bash-4.3$ ./copyfiles.py dir1/file1 dir1/file2 dir2
bash-4.3$ ls dir2
file1  file2

Script em si:

#!/usr/bin/env python3
from shutil import copyfile
from os import path
from sys import argv

new_dir = path.realpath(argv[-1])
for f in argv[1:-1]:
    base = path.basename(f)
    orig_file = path.realpath(f)
    new_file = path.join(new_dir,base)
    copyfile(orig_file,new_file)
    
por Sergiy Kolodyazhnyy 18.10.2016 / 08:49
3

Se você quiser copiá-los no mesmo local (não em um novo diretório) para fazer backups, (por exemplo), você pode usar um pequeno for loop para copiá-los com novos nomes (aqui adicionando um .bak extension)

for f in {mno,xyz}.txt; do cp -- "$f" "$f".bak; done

{ brace expansion } é a maneira mais sucinta de especificar os arquivos específicos em seu exemplo, mas você pode usar qualquer curinga / globbing de shell adequado ou listar os arquivos, se necessário: for f in foo bar baz;

    
por Zanna 18.10.2016 / 09:03