J'essaie de copier tous les fichiers et dossiers d'un répertoire à un autre, mais j'exclus certains fichiers. Plus précisément, je souhaite exclure les fichiers et dossiers de subversion. Cependant, j'aimerais une solution générale mais concise.
J'imagine que je trouverai la nécessité d'exclure plusieurs types de fichiers dans un avenir proche. Par exemple, je souhaiterais peut-être exclure .svn, * .bak et * .prj.
Voici ce que j'ai préparé pour, mais cela ne fonctionne pas pour moi. La première partie, trouver des travaux, mais je fais quelque chose de mal avec xargs et cp . J'ai essayé cp avec et sans le -R
. En outre, j'utilise OS X et il semble avoir une version moins en vedette de xargs que les systèmes Linux.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
find
commande utilise correctement-prune
pour exclure les éléments .svn, vous passez ensuite l'-R
indicateurcp
auquel indique que cette commande est récursive. Dans ce cas, vous perdez la granularité que vous aviez dans lafind
commande. Je vais bricoler avec cela pendant une minute, mais je pense que la réponse n'est pas à utiliser-R
dans lacp
commande.-R
drapeau, j'en suis presque sûr. Supprimez cela et ça devrait aller (même si vous voudrez peut-être ajouter-mindepth 1
pour ignorer le dossier du répertoire de haut niveau que vous ne voulez pas copier, je suppose)Réponses:
(Modifié après avoir relu la question. Le répondant dit que rsync n'est pas installé)
Un problème possible avec votre solution find / xargs est les espaces dans les noms de fichiers. Pour contourner cela, dites à find et xargs d'utiliser un caractère nul (ASCII 0) pour séparer les fichiers trouvés:
Si vous trouvez que rsync est disponible, je pense toujours que rsync est la meilleure solution:
Utilisez rsync avec l'option -C. Depuis la page de manuel de rsync :
Cela indiquera à rsync d'ignorer ces modèles:
Par exemple:
(Remarque: si vous n'êtes pas encore familier avec rsync, assurez-vous de lire sur cette page de manuel comment rsync gère une barre oblique de fin dans le chemin source. Il se comporte différemment si vous incluez la barre oblique que si vous ne le faites pas. Recherche de 'slash de fin')
la source
-R
drapeau dans laxargs
partie de la commande.Pas une solution générale mais ... vous pouvez utiliser la commande d'exportation svn pour créer une copie de l'espace de travail sans les dossiers de métadonnées .svn.
la source
si vous voulez, vous pouvez même mettre 'pv' ou quelque chose de similaire entre les 2 processus tar.
la source
Une manière sale mais rapide et concise:
Cela copie un répertoire dans un autre (donc l'option récursive
-r
) puis efface récursivement tout ce qui est nommé.svn
(en ignorant la casse).la source
Je procéderais différemment, en utilisant tar et son mécanisme d'exclusion.
De dans le répertoire de destination:
Cela va créer un CD vers la source, tarer le contenu, excluant ce qui est répertorié dans le fichier d'exclusion, puis le décompresser dans le répertoire en cours.
la source
Réponse modifiée : Le problème est que
-R
votre copie est récursive et que vous finissez par copier les fichiers cachés. Voici ce que j'utiliserais:Le
-mindepth 1
drapeau indiquefind
d'ignorer le répertoire de haut niveau. Étant donné que vous souhaitez copier tout le contenu de ce répertoire dans un nouveau répertoire de niveau supérieur, je suppose que vous ne le souhaitez pas.Comme Chris Nava le dit dans sa réponse , il existe déjà un moyen intégré de le faire si nous parlons de dossiers SVN, mais puisque vous avez demandé une solution plus générale, cela peut aider un peu.
la source
xargs
n'est pas cassé, mais sur les systèmes de type Unix, la valeur par défaut n'est pas d'utiliser les noms de fichiers (ou noms de répertoires) avec des espaces dedans. Si vous avez des espaces ou des caractères "drôles" dans vos noms de fichiers (ou noms de répertoire), vous devez faire un travail supplémentaire pour y faire face. (Dans GNUfind
, il y a une section entière dans laman
page intitulée "FILMS NOMBREUX" à cause de ce problème.) Le-0
drapeau dansxargs
et-print0
pourfind
aider à gérer ces problèmes. Je vous promets, cependant, que vous ne voulez pas utiliser-R
dans votre commande de copie. Il annulera tout ce que vous faites pour éviter les répertoires SVN.Je suppose que cela dépend de la taille de votre arbre est, mais pourquoi ne pas copier simplement tout d' abord, puis couper les dossiers .svn après:
?
la source
find
commande, mais vous ne le faites qu'une seule fois. Vous pouvez utiliser la commande des centaines de fois, une fois que vous avez bien compris.find
mieux m'utiliser, pour ne pas avoir à le faire. Mais vous avez raison: il n'y a rien de mal à cette solution.N'oubliez pas grep -v
la source
Vous pouvez également faire le contraire. Copiez tout puis supprimez les dossiers .svn à l'aide de la commande ci-dessous:
la source