web-dev-qa-db-fra.com

copier deux fichiers à la fois

Que faire si je veux copier deux fichiers à la fois en utilisant la commande? disons que j'ai un dossier nommé ABC et les fichiers sont

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

Maintenant, je veux cp mno.txt et xyz.txt à la fois. Comment puis-je faire ceci ?

6
Avani badheka

En supposant que vous souhaitiez cp fichiers dans un répertoire, vous pouvez utiliser la syntaxe habituelle pour cp:

cp mno.txt xyz.txt destination_directory

Ou utilisez l’accolade expansion par souci de brièveté:

cp {mno,xyz}.txt destination_directory

Par souci de clarté, il est préférable d'utiliser l'option -t (--target-directory) de cp, il s'agit de GNU-ism:

cp -t destination_directory {mno,xyz}.txt

Notez simplement que si vous voulez cp le contenu de plusieurs fichiers en une seule opération de cp, vous ne pouvez pas. cp traite un fichier à la fois lors de la copie du contenu d'un fichier dans un autre.

16
heemayl

Utilisez la syntaxe cp -t destination_dir/ file1 file2.

Exemple:

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

Ajout à la réponse originale.

Les utilisateurs qui aiment jouer avec python peuvent être intéressés par le script suivant, qui permet de copier un nombre arbitraire de fichiers spécifiés sur la ligne de commande, le dernier argument étant la destination.

Démo:

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

Le script lui-même:

#!/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)
3

si vous voulez les copier au même emplacement (pas dans un nouveau répertoire) pour effectuer des sauvegardes (par exemple), vous pouvez utiliser une très petite boucle for pour les copier avec de nouveaux noms (en ajoutant ici une extension .bak)

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

{brace expansion} est la manière la plus succincte de spécifier les fichiers particuliers dans votre exemple, mais vous pouvez utiliser n'importe quel caractère générique de Shell/globbing approprié, ou lister les fichiers si nécessaire: for f in foo bar baz;

3
Zanna

Vous pouvez faire comme ça:

cp {mno,xyz}.txt /path/to/destination

Ou si vous avez besoin de tous les fichiers .txt:

cp {*}.txt /path/to/destination
1
Mher Asatryan