2010-09-04 7 views
150

En bash je dois faire ceci:Copier les fichiers d'un répertoire dans un répertoire existant

  1. prendre tous les fichiers dans un répertoire

  2. les copier dans un répertoire existant

Comment est-ce que je fais ceci? J'ai essayé cp -r t1 t2 (les deux t1 et t2 sont des répertoires existants, t1 contient des fichiers) mais il a créé un répertoire appelé t1 à l'intérieur de t2, je ne veux pas, j'ai besoin des fichiers dans t1 pour aller directement dans t2. Comment puis-je faire cela?

+7

Pourquoi était-ce fermé? Il est arbitraire si une commande bash est une commande intégrée ou externe (par exemple, printf existe comme les deux sur la plupart des systèmes), donc les questions 'cp' peuvent être considérées comme des questions' bash', qui est un langage de programmation. Je n'ai jamais vu une question Python parler de la copie du fichier être fermé. –

+0

Jetez un oeil à ce https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside – theGiallo

Répondre

18
cp dir1/* dir2 

Ou si vous avez des répertoires à l'intérieur dir1 que vous voudriez copier ainsi

cp -r dir1/* dir2 
+2

Selon la façon dont votre shell est configuré, vous devrez probablement utiliser "dir1/* dir1 /.*" au lieu de "dir1/*" si vous voulez également récupérer des fichiers cachés. – ssokolow

+2

Copier 'dir1 /.* 'n'est pas une bonne idée, car il copie dir1/.. (c'est-à-dire le parent du répertoire que vous essayez de copier). Il copie également dir1 /. ce qui est bien, sauf que c'est déjà (la plupart du temps) copié, donc vous faites le travail deux fois. –

+1

Vous pouvez contourner le problème 'dir1 /.*'/fichiers cachés en cd-ing dans le répertoire que vous voulez copier, puis en vous y référant comme '.'. Donc, si vous voulez copier tous les fichiers y compris les fichiers cachés d'un répertoire dans un répertoire existant, vous pouvez: 'cd [source dir]', 'cp. [chemin vers le répertoire de destination, sans barre oblique finale] '. – RobW

2
cp -R t1/ t2 

Le slash sur le répertoire source change la sémantique légèrement, il copie le contenu mais pas le répertoire lui-même. Il évite également les problèmes de globbing et de fichiers invisibles que la réponse de Bertrand a (copier t1/* manque les fichiers invisibles, en copiant les copies t1/* t1 /.* 't1 /. Et t1/.., que vous ne voulez pas).

+0

Votre solution ne fonctionne pas, du moins pas sur mon installation (ubuntu 12.10) '$ mkdir t1' ' $ mkdir t2' 'touche $ t1/One' ' touche $ t1/two' '$ touch t1/.three' '$ cp -R t1/t2' ' $ ls t2/'' t1' (désolé pas codeformat dans les commentaires, version lisible à http://pastebin.com/yszSxV6G) – zpon

1

Selon certains détails que vous pourriez avoir besoin de faire quelque chose comme ceci:

r=$(pwd) 
case "$TARG" in 
    /*) p=$r;; 
    *) p="";; 
    esac 
cd "$SRC" && cp -r . "$p/$TARG" 
cd "$r" 

... cela change fondamentalement le répertoire SRC ainsi que des copies à la cible, puis revient jamais d'où vous avez commencé.

Le problème supplémentaire est de gérer des cibles relatives ou absolues.

(Cela ne veut pas compter sur la sémantique subtile de la commande elle-même ... cp sur la façon dont il gère les spécifications de la source avec ou sans fuite/... puisque je ne suis pas sûr ceux qui sont stables, portable et fiable au-delà de GNU cp et je ne sais pas s'ils continueront à l'être dans le futur).

242

Qu'est-ce que vous voulez est:

cp -R t1/. t2/ 

Le point à la fin indique à copier le contenu du répertoire courant, pas le répertoire lui-même. Cette méthode inclut également des fichiers et des dossiers cachés.

+2

je vraiment comme cette syntaxe, mais pour une raison quelconque, cela ne fonctionne pas avec 'mv'. Quelqu'un sait-il pourquoi? –

+1

Incroyable. Où est-ce documenté? Est-ce POSIX ou une extension? –

26

Si vous voulez copier quelque chose d'un répertoire dans le répertoire courant , faites ceci:

cp dir1/* . 

Cela suppose que vous n'êtes pas essayer de copier les fichiers cachés.

+11

Misses fichiers cachés. –

Questions connexes