Je voudrais copier un contenu du répertoire 1 dans le répertoire 2. Cependant, je voudrais seulement copier les fichiers (et non les répertoires) de mon répertoire 1. Comment faire?
cp dir1/* dir2/*
alors j'ai toujours le problème des répertoires.
De plus, tous mes fichiers n'ont pas d'extension, donc . ne fera pas l'affaire
cp dir1/* dir2
oucp -t dir2 dir1/*
Réponses:
cp
ne copiera pas les répertoires sauf indication explicite de le faire (avec--recursive
par exemple, voirman cp
).Remarque 1:
cp
quittera très probablement avec un état différent de zéro, mais les fichiers auront quand même été copiés. Cela peut être un problème lorsque enchaînant les commandes basées sur les codes de sortie:&&
,||
,if cp -r dir1/* dir2; then ...
, etc. (Merci à contrebis pour leurs commentaires sur cette question )Remarque 2 :
cp
attend que le dernier paramètre soit un nom de fichier ou un répertoire unique. Il ne devrait vraiment pas y*
avoir de caractère générique après le nom du répertoire cible.dir2\*
sera développé par le shell commedir1\*
. Des choses inattendues se produiront:dir2
est vide et dépend de votre shell et de vos paramètres:dir2/*
sera pris littéralement (à la recherche d'un fichier / répertoire nommé*
), ce qui entraînera probablement aussi une erreur, sauf s'il*
existe réellement.dir2/*
il sera tout simplement supprimé de la commande, laissantcp dir1/*
. Ce qui, selon l'expansion dedir1/*
, peut même détruire des données:dir1/*
correspond à un seul fichier ou répertoire, vous obtiendrez une erreur decp
.dir1/*
correspond exactement à deux fichiers, l'un sera écrasé par l'autre ( Mauvais ).dir/*
correspond à plusieurs fichiers et que la dernière correspondance est un, vous obtiendrez un message d'erreur.dir/*
est un répertoire, toutes les autres correspondances y seront déplacées.dir2
n'est pas vide, cela dépend encore:dir2/*
est un répertoiredir1/*
et que les autres correspondances dedir2/*
seront déplacées dans.dir2/*
est un fichier, vous obtiendrez probablement un message d'erreur, sauf s'il nedir1/*
correspond qu'à un seul fichier.la source
$ cp dir1/* dir2
->cp: dir1/isadir is a directory (not copied).
sort avec le statut 1 pour moi.cp
ne copie les fichiers correspondantdir1/*
sur tous les systèmes que j'ai vérifié: Arch Linux, Ubuntu 14.04, OpenBSD 3.9 et 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 et 10 (oùcp
effectivement les sorties avec le code 2). Ce comportement n'est donc pas nouveau (SuSE 8.1 date de 2002) ni limité à Linux.cp
quitte avec un code de sortie différent de zéro car il ne pouvait pas faire tout ce qu'on lui avait demandé de faire. Cela ne veut pas dire que cela ne fait rien .&&
cela, cela peut causer un problème. J'essayais quelque chose comme ça bien que je ne me souvienne plus du contexte maintenant.*
fichiers cachés ou la manière d'inclure des fichiers cachés dépend du shell. Si le*
ne comprend pas de fichiers cachés, vous pouvez les faire correspondre avec.*
. Notez que cela inclura.
et..
surbash
etdash
mais pas surzsh
. Dans le cadre de cette réponse que vous pouvez vous en sortir aveccp dir1/* dir1/.* dir2
parce que.
et..
sont des répertoires et ne seront pas copiés.zsh
peut également être fait pour inclure des fichiers cachés avec*(D)
.C'est le shell qui étend les caractères génériques, pas les commandes. Développe donc d'
cp dir1/* dir2/*
abord les deux caractères génériques, puis appellecp
le résultat. Ce n'est pas du tout ce à quoi vous vous attendez apparemment: en fonction du nombre de fichiers qu'il contient déjàdir2
, ildir2/*
peut s'agir d'un ou de plusieurs arguments. La commandecp
ne sait pas lequel de ses arguments provenait de l'expansion du premier motif et lesquels provenaient de l'expansion du deuxième motif. Il s'attend à ce que son dernier argument soit le nom du répertoire de destination. Ainsi, pour copier tous les fichiers du répertoiredir1
dans le répertoiredir2
, le dernier argument doit être le répertoiredir2
:Depuis
*
correspond à tous les fichiers,cp
tente de copier tous les fichiers. Cela inclut les répertoires: les répertoires sont aussi des fichiers. Il ignore les répertoires, mais signale une erreur. Il copie le contenu de fichiers spéciaux tels que les canaux nommés (quelque chose vaut mieux y écrire, oucp
va les bloquer), etc.Pour copier uniquement les fichiers normaux , vous devez restreindre la correspondance. Dans zsh, vous pouvez utiliser le qualificatif glob
.
pour cela:D'autres obus n'en ont pas. Vous pouvez utiliser la
find
commande pour filtrer les types de fichiers. En supposant que vous exécutez Linux ou Cygwin non intégré:Sous Linux, FreeBSD et OSX:
la source
-maxdepth 1
. De même, existe-t-il un moyen de copier récursivement et de conserver la hiérarchie de répertoires d'origine dans le répertoire de destination?-maxdepth 1
, lafind
commande serait récursive dans des sous-répertoires, ce qui n'était pas souhaité ici. Si vous voulez copier l'arborescence des répertoires , y compris l' ensemble des sous - répertoires, il est une question tout à fait différente, et la réponse est beaucoup plus simple:cp -a dir1 dir2
.Vous trouverez ci-dessous la commande pour copier le fichier du répertoire source vers le répertoire de destination.
Allez dans le dossier source puis écrivez la commande ci-dessous:
$ cp fileName destination directory path
Exemple:
la source