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?

Oguz Bilgic
la source
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
Lekensteyn
la source
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/.

Gilles 'SO- arrête d'être méchant'
la source
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.

alex
la source
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/
karlphillip
la source
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
Ivern
la source
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

Rahul
la source
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.