Copiez des fichiers d'un répertoire dans un répertoire existant


248

En bash, je dois faire ceci:

  1. prendre tous les fichiers dans un répertoire

  2. les copier dans un répertoire existant

Comment puis-je faire cela? J'ai essayé cp -r t1 t2(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 le veux pas, j'ai besoin que les fichiers de t1 se rendent directement à l'intérieur de t2. Comment puis-je faire cela?


11
Pourquoi était-ce fermé? C'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 cpquestions peuvent bien être vues comme des bashquestions, qui est un langage de programmation. Je n'ai jamais vu une question Python parler de la copie de fichiers être fermée.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功


Je suis arrivé à la recherche d'un rappel sur la syntaxe de la commande de copie du shell Bash, et je suis heureux de signaler que ces commandes semblent également fonctionner contre le système de fichiers NTFS sous-jacent sur mon installation Windows.
David A. Gray

Réponses:


396

Ce que vous voulez c'est:

cp -R t1/. t2/

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


2
J'aime vraiment cette syntaxe, mais pour une raison quelconque, elle ne fonctionne pas mv. Quelqu'un sait-il pourquoi?
Martin von Wittich

2
Incroyable. Où est-ce documenté? Est-ce POSIX ou une extension?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

9
@CiroSantilli 六四 事件 法轮功 包 卓 轩 Si vous copiez un répertoire, cp créera un répertoire et copiera tous les fichiers dedans. Si vous utilisez le dossier de simulation appelé ".", Qui est le même que le répertoire qui le contient, la copie se comporte de cette façon. Disons que t1 contient un fichier appelé "fichier". cp exécutera l'opération équivalente à "cp t1 /./ fichier t2 /./". Il copie le dossier ".", Mais copie les fichiers dans le t2 "." le dossier supprime le "./" car "t2 /./" est identique à "t2 /". Techniquement, cela signifie que c'est un comportement POSIX intégré ... mais probablement pas de la manière à laquelle vous vous attendiez!
frappant


32
cp dir1/* dir2

Ou si vous avez des répertoires dans dir1 que vous souhaitez également copier

cp -r dir1/* dir2

3
Selon la configuration de votre shell, vous devrez probablement utiliser "dir1 / * dir1 /.*" au lieu de "dir1 / *" si vous souhaitez également intercepter les fichiers cachés.
ssokolow

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

1
Vous pouvez contourner le dir1/.*problème des fichiers / cachés en entrant le répertoire dans lequel vous souhaitez copier, puis en vous y référant comme .. Donc, si vous souhaitez 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 . [path to destination dir, with no trailing slash].
RobW

8

En supposant que t1 est le dossier contenant des fichiers et t2 est le répertoire vide. Ce que vous voulez, c'est quelque chose comme ça:

sudo cp -R t1/* t2/

Gardez à l'esprit que pour le premier exemple, t1 et t2 doivent être les chemins complets ou les chemins relatifs (en fonction de l'endroit où vous vous trouvez). Si vous le souhaitez, vous pouvez accéder au dossier vide (t2) et procédez comme suit:

sudo cp -R t1/* ./

Ou vous pouvez accéder au dossier contenant les fichiers (t1) et procédez comme suit:

sudo cp -R ./* t2/

Remarque: le signe * (ou caractère générique) représente tous les fichiers et dossiers. Le drapeau -R signifie récursivement (tout à l'intérieur de tout).


2
cp -R t1/ t2

La barre oblique de fin du répertoire source modifie légèrement la sémantique, de sorte qu'elle copie le contenu mais pas le répertoire lui-même. Cela évite également les problèmes de globalisation et de fichiers invisibles que la réponse de Bertrand a (la copie t1/*manque des fichiers invisibles, la copie de `t1 / * t1 /.* 'copie t1 /. Et t1 / .., ce que vous ne voulez pas).


Votre solution ne fonctionne pas, du moins pas sur mon installation (Ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (désolé, pas de format de code dans les commentaires, version lisible sur pastebin.com/yszSxV6G )
zpon

2

Selon certains détails, vous devrez peut-être 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 et le copie sur la cible, puis revient à l'endroit où vous avez commencé.

L'agitation supplémentaire consiste à gérer des cibles relatives ou absolues.

(Cela ne s'appuie pas sur une sémantique subtile de la cpcommande elle-même ... sur la façon dont elle gère les spécifications des sources avec ou sans trailing / ... car je ne suis pas sûr qu'elles soient stables, portables et fiables au-delà de GNU cpet I Je ne sais pas s'ils continueront de l'être à l'avenir).


1

Pour l'intérieur de certains répertoires, ce sera pleinement utilisé car il copie tout le contenu de "dossier1" dans le nouveau répertoire "dossier2" à l'intérieur de certains répertoires.

$ (pwd) obtiendra le chemin du répertoire courant.

Remarquez le point (.) Après folder1 pour obtenir tout le contenu dans folder1

cp -r $(pwd)/folder1/. $(pwd)/folder2
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.