J'essaye d'écrire un script bash simple qui va copier le contenu entier d'un dossier comprenant des dossiers et des dossiers cachés dans un autre dossier, mais je veux exclure certains dossiers spécifiques. Comment pourrais-je y parvenir?Copier le dossier de manière récursive, excluant certains dossiers
Répondre
Utilisez rsync:
rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Notez que l'utilisation source
et source/
sont différents. Une barre oblique signifie copier le contenu du dossier source
en destination
. Sans la barre oblique, cela signifie copier le dossier source
en destination
.
Vous pouvez également utiliser --exclude-from=FILE
si vous avez beaucoup de répertoires (ou de fichiers) à exclure, FILE
étant le nom d'un fichier contenant des fichiers ou des répertoires à exclure.
--exclude
peut également contenir des caractères génériques, tels que --exclude=*/.svn*
note 'path1/to/exclude' etc sont un sous-répertoire de "source". – abe
Si vous - comme moi - voulez récursivement copier une structure entière et ne garder qu'un certain type de fichiers alors vous pouvez aussi utiliser rsync: rsync -rav --include = */--include = "*. Txt" - -exclude = * test/mytest Cela prendra tous les fichiers .txt du répertoire source et les copiera dans le répertoire de destination avec la structure intacte. – slott
Je suggère d'ajouter le --dry-run afin de vérifier quels fichiers vont être copiés. – loretoparisi
similaires à l'idée de Jeff (non testé):
find . -name * -print0 | grep -v "exclude" | xargs -0 -I {} cp -a {} destination/
EXCLUDE="foo bar blah jah"
DEST=$1
for i in *
do
for x in $EXCLUDE
do
if [ $x != $i ]; then
cp -a $i $DEST
fi
done
done
... Untested
vous pouvez utiliser le goudron, avec option --exclude, puis décompressez en destination. par exemple
cd /source_directory
tar cvf test.tar --exclude=dir_to_exclude *
mv test.tar /destination
cd /destination
tar xvf test.tar
voir la page de manuel de goudron pour plus d'infos
Utilisez le goudron le long d'un tuyau.
cd /source_directory
tar cf - --exclude=dir_to_exclude . | (cd /destination && tar xvf -)
Vous pouvez même utiliser cette technique sur ssh.
Ne devrait-il pas y avoir un point avant le tuyau? C'est à dire, "tar cf - --exclude = dir_to_exclude. |" ... –
Correct, mis à jour. –
@Kyle Butt, Quand je google, il dit que nous utilisons tar pour convertir un groupe de fichiers dans une archive, alors comment cela fonctionnera pour copier le dossier, pouvez-vous expliquer cela, j'essaye ce code, ça fonctionne parfaitement, mais je besoin d'une bonne compréhension dans cette commande. – acer
Vous pouvez utiliser find
avec l'option -prune
.
Un exemple de man find
:
cd /source-dir find . -name .snapshot -prune -o \(\! -name *~ -print0 \)| cpio -pmd0 /dest-dir This command copies the contents of /source-dir to /dest-dir, but omits files and directories named .snapshot (and anything in them). It also omits files or directories whose name ends in ~, but not their con‐ tents. The construct -prune -o \(... -print0 \) is quite common. The idea here is that the expression before -prune matches things which are to be pruned. However, the -prune action itself returns true, so the following -o ensures that the right hand side is evaluated only for those directories which didn't get pruned (the contents of the pruned directories are not even visited, so their contents are irrelevant). The expression on the right hand side of the -o is in parentheses only for clarity. It emphasises that the -print0 action takes place only for things that didn't have -prune applied to them. Because the default `and' condition between tests binds more tightly than -o, this is the default anyway, but the parentheses help to show what is going on.
Des accessoires pour localiser un exemple très pertinent directement à partir d'une page de manuel. –
inspiré par @ la réponse de SteveLazaridis, qui échouerait, voici une fonction shell POSIX - il suffit de copier et coller dans un fichier nommé cpx
dans yout $PATH
et de le rendre executible (chmod a+x cpr
). [La source est maintenant maintenue dans mon GitLab.
#!/bin/sh
# usage: cpx [-n|--dry-run] "from_path" "to_path" "newline_separated_exclude_list"
# limitations: only excludes from "from_path", not it's subdirectories
cpx() {
# run in subshell to avoid collisions
(_CopyWithExclude "[email protected]")
}
_CopyWithExclude() {
case "$1" in
-n|--dry-run) { DryRun='echo'; shift; } ;;
esac
from="$1"
to="$2"
exclude="$3"
$DryRun mkdir -p "$to"
if [ -z "$exclude" ]; then
cp "$from" "$to"
return
fi
ls -A1 "$from" \
| while IFS= read -r f; do
unset excluded
if [ -n "$exclude" ]; then
for x in $(printf "$exclude"); do
if [ "$f" = "$x" ]; then
excluded=1
break
fi
done
fi
f="${f#$from/}"
if [ -z "$excluded" ]; then
$DryRun cp -R "$f" "$to"
else
[ -n "$DryRun" ] && echo "skip '$f'"
fi
done
}
# Do not execute if being sourced
[ "${0#*cpx}" != "$0" ] && cpx "[email protected]"
Exemple d'utilisation
EXCLUDE="
.git
my_secret_stuff
"
cpr "$HOME/my_stuff" "/media/usb" "$EXCLUDE"
- 1. Comment déplacer des dossiers de manière récursive?
- 2. Impossible d'archiver le dossier de manière récursive dans SourceOffsite
- 3. Ouvrir certains répertoires de manière récursive dans Dired
- 4. comment puis-je copier des fichiers d'un dossier à un autre tout en excluant certains types de fichiers?
- 5. Comment créer des dossiers de manière récursive dans Delphi?
- 6. L'utilisation de find() excluant certains éléments?
- 7. Rar commande - ignorer certains dossiers
- 8. Supprimer les propriétés de manière récursive
- 9. NSIS - Comment copier récursivement tout en excluant les fichiers?
- 10. Copier le contenu des sous-dossiers avec Ant
- 11. NAnt dossiers de boucle foreach récursive
- 12. Comment dire VS10 Déploiement en un clic pour copier certains fichiers et dossiers
- 13. Comment copier un répertoire de manière récursive et filtrer les noms de fichiers en Perl?
- 14. Création récursive de dossiers dans des répertoires spécifiques
- 15. VS2010 Publier le site Web ne pas copier certains fichiers
- 16. Blob ... comment écrire de manière non récursive
- 17. Création récursive de raccourcis dans un dossier (XP)
- 18. copier un dossier dans
- 19. Copie de certains dossiers d'un projet TFS dans l'autre
- 20. traverse le dictionnaire multidimensionnel de manière récursive, dimension inconnue
- 21. Résumé d'un champ tout en excluant certains champs dans SQL
- 22. Empêche l'outil d'éditeur Visual Studio de copier les dossiers .svn?
- 23. Comment copier/dupliquer un dossier sur S3?
- 24. mod_rewrite convertir certains dossiers aux paramètres
- 25. Ajout de dossiers/sous-dossiers/fichiers dans Git
- 26. dossiers à copier dans C# à l'aide de System.IO
- 27. Dans Ant, copier tous les fichiers d'une arborescence de dossiers dans un seul dossier?
- 28. Comment copier le dossier QT dans un autre dossier sans le réinstaller?
- 29. dossier récursive liste dans un menu déroulant, en php
- 30. énumèrent tous les dossiers dans une liste SharePoint récursive
j'imagine quelque chose comme trouver. -name * redirige vers grep/v "exclude-pattern" pour filtrer ceux que vous ne voulez pas, puis redirige vers cp pour faire la copie. –
J'essayais de faire quelque chose comme ça, mais je ne pouvais pas comprendre comment utiliser cp avec un tuyau – trobrock
Cela devrait probablement aller à super utilisateur. La commande que vous cherchez est xargs. Vous pouvez aussi faire quelque chose comme deux tar connectés par un tuyau. –