J'ai un script bash pour déployer du code d'un environnement bêta à un environnement de production mais actuellement je dois ajouter la liste des fichiers à un fichier txt de manière manaully et parfois j'en manque. Fondamentalement, mon script de déploiement cat / loops copie les fichiers. (exportations / importations db également mais ce n'est pas pertinent..lol)
Quoi qu'il en soit, j'aimerais utiliser la find
commande pour générer une liste de fichiers modifiés au cours des 14 derniers jours. Le problème est que je dois supprimer le chemin d'accès ./
pour que le script de déploiement fonctionne.
Voici un exemple d'utilisation de la commande find:
trouver . -type f -mtime -14> deploy.txt
Voici la ligne que les chats deploy.txt
dans mon script de déploiement:
for i in `cat deploy.txt`; do cp -i /home/user/beta/public_html/$i /home/user/public_html/$i; done
Avez-vous une idée de comment accomplir cela en utilisant le script bash?
Merci!
--dry-run
mode et le publier dans un fichier pour examen?Réponses:
Vous pouvez utiliser l'
-printf
option de ligne de commande avec%f
pour imprimer uniquement le nom de fichier sans aucune information de répertoireou vous pouvez utiliser sed pour simplement supprimer le ./
la source
/.
.|
comme délimiteur.%f
supprimera tous les répertoires, pas seulement./
. Cela interrompra son script de déploiement si l'un des fichiers renvoyés parfind
se trouve dans des sous-répertoires..
. Et peut-être mieux d'utiliser une ancre de début de ligne:s|^\./||
%P
au lieu de%f
. Cela coupe simplement le chemin indiqué dans la ligne de commande.Le
./
devrait être inoffensif. La plupart des programmes traiteront/foo/bar
et/foo/./bar
comme équivalents. Je me rends compte que ce n'est pas très joli, mais d'après ce que vous avez publié, je ne vois aucune raison pour laquelle cela ferait échouer votre script.Si vous voulez vraiment le retirer,
sed
c'est probablement le moyen le plus propre:Si vous êtes sur un système avec GNU find (par exemple la plupart des systèmes Linux), vous pouvez le faire en une seule fois avec
find -printf
:Le
%P
retourne le chemin complet de chaque fichier trouvé, moins le chemin spécifié sur la ligne de commande, jusqu'à et y compris la première barre oblique. Cela préservera tous les sous-répertoires de votre structure de répertoires.la source
./
préfixe est en fait une fonctionnalité; sans cela, la sortie des tuyaux vers d'autres commandes ne fonctionnera pas correctement, par exemple pour les noms de fichiers commençant par un tiret.Pourquoi avez-vous besoin de vous déshabiller
./
? C'est valable d'avoir dans un chemin. Alorsc'est juste ok!
Mais si vous souhaitez supprimer le nom du répertoire dans find, vous pouvez utiliser l'
%P
argument pour-printf
.l'homme trouve (1) dit:
Un exemple
Attention à la première ligne vide! Si vous voulez l'éviter, utilisez
-mindepth 1
la source
Eh bien, vous avez quelques options. Vous pouvez utiliser l'
-printf
option de recherche pour imprimer uniquement le nom du fichier, ou vous pouvez utiliser un outil comme sed pour simplement supprimer le./
.la source
La solution "find -printf" ne fonctionnera pas sur FreeBSD car find n'a pas une telle option. Dans ce cas, AWK peut vous aider. Il renvoie un nom de famille ($ NF), donc il peut fonctionner sur n'importe quelle profondeur.
PS: extrait du livre D.Tansley "Programmation shell Linux et Unix"
la source
Une solution rapide, si je comprends bien la question, utilise
cut
sur la sortie de lafind
commande:Cela supprimera le premier aux caractères de chaque ligne du résultat (dans votre cas
./
). Probablement pas la meilleure solution, mais fonctionne dans votre scénario.la source
sed
est parfait pour ce genre de chose.la source
Je ne sais pas de quel type de nom de fichier nous parlons, mais tout ce qui comporte des espaces ou des nouvelles lignes met en danger la plupart des solutions.
Ma suggestion serait d'utiliser l'expansion des paramètres du shell pour supprimer les caractères de chaque nom de fichier:
Si vous aimez vraiment les pipes, vous pouvez utiliser un délimiteur "sûr", comme un null, avec xargs pour recevoir chaque nom de fichier:
N'oubliez pas que la sortie de ceci n'est PAS délimitée par des valeurs nulles, donc bien que cela puisse être suffisant pour une vérification du globe oculaire, aucune de ces solutions ne produit un fichier deploy.txt qui peut être utilisé en toute sécurité pour l'automatisation, à moins que vous ne soyez très sûr de votre source noms de fichiers.
la source