Comment créer une liste de fichiers modifiés par programmation à l'aide des outils de ligne de commande Linux? Je ne suis pas intéressé par la différence dans un fichier particulier (delta, patch). Je veux juste avoir une liste de fichiers nouveaux ou modifiés par rapport à la version précédente du produit. Pour que je puisse publier une nouvelle mise à jour de produit.
mise à jour: diff -qr
ne produit pas de sortie très pratique. La sortie de diff -qr
doit également être traitée. Y a-t-il une meilleure façon?
linux
bash
command-line
diff
Alpha Sisyphe
la source
la source
Réponses:
J'ai une approche simple pour cela: utilisez le mode de prévisualisation rsync:
Les fichiers qui sont affichés comme "à supprimer" par cette commande seront les "nouveaux" fichiers. Les autres qui doivent être transférés ont changé d'une manière ou d'une autre. Voir la page de manuel rsync pour plus de détails.
la source
Vous pouvez utiliser l' outil diff : voir les options -q et -r
Exemple:
la source
Only in
qui apparaît même si les répertoires sont des copies idéales. J'avais besoin de comparer les modifications par rapport à une ancienne révision, et de finir par télécharger la révision entière dans un répertoire séparé, et d'utiliser des outils SVN standard pour comparer. Cela semble être la seule voie à suivre…Le
diffutils
package comprend unlsdiff
outil.diff -u
Passez simplement la sortie de à lsdiff:la source
patchutils
package pour moi (CentOS 5.x).Je toucherais simplement un fichier au moment de chaque mise à jour, puis vous pourrez trouver des fichiers qui ont été modifiés depuis avec
find /tree/location -newer /last/update/file -print
la source
Pour ne prendre que le nom des fichiers qu'ils ont modifiés, j'utilise cette commande:
Si vous devez exclure certains fichiers en tant que fichiers objets ou fichiers de bibliothèque, vous pouvez utiliser:
la source
Pour créer une liste de fichiers nouveaux ou modifiés par programme, la meilleure solution que j'ai pu trouver consiste à utiliser rsync , sort et uniq :
Laissez-moi vous expliquer avec cet exemple: nous voulons comparer deux versions de dokuwiki pour voir quels fichiers ont été modifiés et lesquels ont été nouvellement créés.
Nous récupérons les goudrons avec wget et les extrayons dans les répertoires
old/
etnew/
:L'exécution de rsync dans un sens peut manquer des fichiers nouvellement créés, comme le montre la comparaison de rsync et diff:
donne la sortie suivante:
L'exécution de rsync dans un seul sens manque les fichiers nouvellement créés et dans l'autre sens, les fichiers supprimés sont manquants, comparez la sortie de diff:
donne la sortie suivante:
L'exécution de rsync dans les deux sens et le tri de la sortie pour supprimer les doublons révèlent que le répertoire
data/pages/playground/
et le fichierdata/pages/playground/playground.txt
ont été manqués initialement:donne la sortie suivante:
rsync
est exécuté avec ces arguments:-r
"recurse dans les répertoires",-c
pour comparer également des fichiers de taille identique et uniquement "sauter en fonction de la somme de contrôle, pas du temps et de la taille du mod",-n
"effectuer un essai sans aucune modification", et--out-format="%n"
à "afficher les mises à jour en utilisant le FORMAT spécifié", qui est "% n" ici pour le nom de fichier uniquementLa sortie (liste des fichiers)
rsync
dans les deux directions est combinée et triée à l'aide desort
, et cette liste triée est ensuite condensée en supprimant tous les doublons avecuniq
la source
Vous devriez obtenir le résultat souhaité en utilisant:
la source
Cela pourrait faire l'affaire:
la source
Normalement, vous placez les fichiers dans une sorte de système de contrôle de version comme SubVersion ou git, car ceux-ci peuvent le faire à votre place.
Mais vous pouvez faire un script rapide avec une boucle for sur dir1, puis comparer chaque fichier avec celui de dir2. La boucle for peut regarder le code de sortie de diff pour savoir si les fichiers étaient différents.
Peut-être quelque chose comme ça:
Remarque: Le script n'est pas testé, donc l'exemple ci-dessus est "pseudocode inspiré de bash" ...
Prenons un autre essai mais avec git
Créez des exemples de fichiers pour jouer avec
Entrez ensuite le dir et importez dir1
Sortez et modifiez dir1 (pour qu'il devienne votre dir2)
Ensuite, allez dans le répertoire git et importez le nouveau répertoire
Maintenant, demandez à git ce qui a changé (avec la commande status)
La sortie est une liste avec les changements, qui ressemble à ceci:
la source
Vous seriez peut-être plus heureux avec quelque chose de différent. Essayez
git
.Faites ceci comme exemple:
git
suivra vos fichiers pour vous. La commandegit status
vous montrera tous les fichiers qui ont été modifiés depuis le dernier commit.la source
Ceci est similaire à rsync: affiche quand le nouveau fichier sur la destination doit être écrasé (demandé plus tard, mais pas en double).
Comme indiqué dans la question, "diff -q -r" peut nécessiter un certain traitement pour être utile. La question ne précisait pas la forme de la sortie; les réponses donnent différents types de rapports.
rsync
est un outil utile à cet effet car il est beaucoup plus rapide quediff
. Cependant, la solution suggérée par @nils est beaucoup plus détaillée (et répertorie plus de fichiers) que les différences réelles entre les anciennes / nouvelles arborescences de répertoires. Par exemple, en comparant cela avec le script que j'ai écrit pour cette réponse, et en exécutant les mêmes données,Pour rendre
diff
correctement compte des nouveaux fichiers, vous avez également besoin de l'-N
option (que je ne vois dans aucune des réponses suggérées). Cependant, puisqu'il est beaucoup plus lent (ordres de grandeur) quersync
, l'amélioration de la production de ce dernier semble être la voie à suivre.Lectures complémentaires
la source
J'ai toujours été partial pour sha1sum (ou même md5sum; dans ce contexte, c'est assez sûr).
Parfois - comme si vous avez trop de fichiers renommés ou déplacés - le tri sur le premier champ et ensuite faire le diff pourrait aider, mais la plupart du temps c'est assez bien.
Notez que, par rapport à certaines des autres méthodes, cela présente l'avantage que vous n'avez pas besoin de conserver une copie des fichiers "avant"; seul le fichier de sortie md5sum.
la source