Existe-t-il un moyen d'utiliser le cp
pour copier un répertoire et exclure certains fichiers/sous-répertoires qu'il contient ?
Réponses
Trop de publicités?Utilice rsync
:
rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Notez que l'utilisation de source
y source/
sont différentes. Une barre oblique de fin signifie qu'il faut copier le contenu du dossier source
en destination
. Sans le slash de fin, cela signifie copier le dossier source dans destination
.
Alternativement, si vous avez beaucoup de répertoires (ou de fichiers) à exclure, vous pouvez utiliser la commande --exclude-from=FILE
où FILE
est le nom d'un fichier contenant les fichiers ou les répertoires à exclure.
-av
signifie mode archive et verbeux.
--exclude
peut également contenir des caractères génériques, tels que --exclude=*/.svn*
.
Copié de : https://stackoverflow.com/a/2194500/749232
Si vous voulez utiliser cp
lui-même :
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Cela suppose que la structure du répertoire cible est la même que celle de la source.
Copié de : https://stackoverflow.com/a/4586025/749232
J'interviens tardivement, mais voici une solution très différente qui utilise le simple Bash et cp
Vous pouvez utiliser une spécification de fichier globale tout en ignorant certains fichiers.
Supposons que le répertoire contient les fichiers :
$ ls *
listed1 listed2 listed3 listed4 unlisted1 unlisted2 unlisted3
Utilisation de la GLOBIGNORE variable :
$ export GLOBIGNORE='unlisted*'
$ ls *
listed1 listed2 listed3 listed4
Ou avec des exclusions plus spécifiques :
$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1 listed2 listed3 listed4 unlisted3
Ou en utilisant correspondances négatives :
$ ls !(unlisted*)
listed1 listed2 listed3 listed4
Ce système prend également en charge plusieurs motifs non appariés :
$ ls !(unlisted1|unlisted2)
listed1 listed2 listed3 listed4 unlisted3
Démarrage rapide
Cours :
rsync -av --exclude='path1/in/source' --exclude='path2/in/source' [source]/ [destination]
Notes
-
-avr
va créer un nouveau répertoire nommé[destination]
. -
source
ysource/
créent des résultats différents :-
source
- copier le contenu de la source vers la destination. -
source/
- copier le dossier de la source à la destination.
-
- Pour exclure plusieurs fichiers :
-
--exclude-from=FILE
-FILE
est le nom d'un fichier contenant d'autres fichiers ou répertoires à exclure.
-
-
--exclude
peut également contenir des caractères génériques :- par exemple
--exclude=*/.svn*
- par exemple
Modifié à partir de : https://stackoverflow.com/a/2194500/749232
Exemple
Structure du dossier de départ :
.
destination
source
fileToCopy.rtf
fileToExclude.rtf
Cours :
rsync -av --exclude='fileToCopy.rtf' source/ destination
Fin de la structure du dossier :
.
destination
fileToExclude.rtf
source
fileToCopy.rtf
fileToExclude.rtf
Vous pouvez utiliser cp
avec le !
caractère.
Par exemple, pour exclure le ou les fichiers file.txt
, test.jpg
et le répertoire nodir
tout en copiant tous les autres à partir de l source
dans le répertoire destination
vous pouvez exécuter :
cp source/!(file.txt|test.jpg|nodir) destination
Si vous avez, par exemple, une structure de fichier comme celle-ci :
.
destination
source
file.rtf
file.txt
test.jpg
yes
| test.jpg
nodir
other.jpg
Le résultat après l'exécution de la commande ci-dessus est :
.
source (not modified)
destination
file.rtf
yes
test.jpg
Voici un article contenant des informations sur rsync
y cp
avec exclure : Comment copier cp et exclure les fichiers ou répertoires internes (équivalent à rsync -exclude)