Copie du contenu du répertoire courant dans un sous-répertoire


13

Comment puis-je utiliser le terminal Linux pour copier tout dans le répertoire courant vers un sous-répertoire?


Voulez-vous dire copier ou déplacer?
Craig

Réponses:


12

Si vous souhaitez copier le contenu du dossier de manière récursive (générera 1 erreur, alternatives ci-dessous):

cp -r * sub/

Un peu plus hacky, mais fonctionne sur des sous-répertoires non vides:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

Un autre oneliner:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

Ou récursif:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done

cela ne fonctionne pas si sub / n'est pas vide -> sub sera à nouveau copié dans sub, sauf si c'est ce que voulait @Oguz.

Ok je suis enfin satisfait du findcode: D
Lekensteyn

2
Votre deuxième commande échoue pour les noms de fichiers qui incluent des espaces. Utilisez xargsou -exec. Pas besoin de grep- utiliser ! -name "$TARGETDIR"ou similaire. Vous avez des citations inégalées $file. Je ne pense pas qu'un récursif cpfonctionnera comme vous le souhaitez, sauf dans votre première commande.
pause jusqu'à nouvel ordre.

Wohaa, a raté une citation dans les derniers codes. Bon commentaire Dennis, je n'ai jamais pensé à utiliser -name dans ce cas :)
Lekensteyn

4

Supposons que targetle nom du sous-répertoire cible, si votre shell est bash:

shopt -s extglob
cp -r !(target) target/

Dans ksh, vous pouvez le faire directement cp -r !(target) target/.

Dans zsh, vous pouvez le faire setopt ksh_globensuite cp -r !(target) target/. Une autre possibilité est setopt extended_globalors cp -r ^target target/.


2

Je suggérerais de déplacer le répertoire cible en dehors du répertoire source, puis de le remettre à nouveau; mv est gratuit (si vous faites attention de ne pas passer à un autre système de fichiers), sauf si vous vous attendez à ce que d'autres processus interfèrent / soient perturbés.

La plupart des solutions publiées ci-dessus ne fonctionneront pas s'il y a des espaces dans les noms de fichiers. Je suggérerais d'utiliser des variantes de find -print0 | xargs -0, ou trouver -exec, etc.


0

Est-ce que cela fonctionnera pour vous?

cp -r * subdir/

Si vous aviez l'intention de déplacer au lieu de tout copier dans le répertoire courant vers un sous-répertoire, vous pourriez faire:

mv * subdir/

cela ne prend pas en charge les répertoires non vides

Je viens de tester et cela a fonctionné.
karlphillip

vous devez copier les répertoires non vides de manière récursive comme l'a suggéré @Lekensteyn.

-1

Cela copiera tout, y compris les fichiers dot, et n'incluant pas le répertoire cible lui-même, dans le répertoire cible SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
Échoue pour les noms de fichiers qui incluent des espaces.
pause jusqu'à nouvel ordre.

-1

Cela va dans le fichier dirCopy.sh



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

exécutez-le comme "sh dirCopy.sh" dans votre console


2
Pas besoin de ls: for file in *. Pas besoin de backticks - utilisation $(). Pas besoin de backticks (ou $()) autour de la cpcommande (cela produira un message d'erreur).
pause jusqu'à nouvel ordre.
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.