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.