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/.
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.
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).
Réponses:
Si vous souhaitez copier le contenu du dossier de manière récursive (générera 1 erreur, alternatives ci-dessous):
Un peu plus hacky, mais fonctionne sur des sous-répertoires non vides:
Un autre oneliner:
Ou récursif:
la source
find
code: Dxargs
ou-exec
. Pas besoin degrep
- utiliser! -name "$TARGETDIR"
ou similaire. Vous avez des citations inégalées$file
. Je ne pense pas qu'un récursifcp
fonctionnera comme vous le souhaitez, sauf dans votre première commande.Supposons que
target
le nom du sous-répertoire cible, si votre shell est bash:Dans ksh, vous pouvez le faire directement
cp -r !(target) target/
.Dans zsh, vous pouvez le faire
setopt ksh_glob
ensuitecp -r !(target) target/
. Une autre possibilité estsetopt extended_glob
alorscp -r ^target target/
.la source
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.
la source
Est-ce que cela fonctionnera pour vous?
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:
la source
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
:la source
Cela va dans le fichier dirCopy.sh
exécutez-le comme "sh dirCopy.sh" dans votre console
la source
ls
:for file in *
. Pas besoin de backticks - utilisation$()
. Pas besoin de backticks (ou$()
) autour de lacp
commande (cela produira un message d'erreur).