Script permettant de modifier l'heure de modification des files et des directorys récursivement

J'ai beaucoup de gros dossiers avec des milliers de files en eux et je veux utiliser le touch pour définir leurs time de modification pour être "time d'origine" +3 heures.

J'ai obtenu ce script à partir d'un thread similaire en super-user:

 #!/bin/sh for i in all/*; do touch -r "$i" -d '+3 hour' "$i" done 

donc je devine ce que j'ai besoin est de le faire fonctionner dans n'importe quel directory au lieu d'un fixe (donc je n'aurai pas besoin de modifier le script chaque fois que je veux l'exécuter quelque part différent) et pour pouvoir find et éditer files récursivement.

J'ai peu d'expérience avec Linux et c'est la première fois que je crée un script bash, mais je connais une chose ou deux en programmation (principalement en C).

merci beaucoup à tous pour l'aide 🙂

Utilisez find -exec pour le touch récursif, avec des find -exec de command line pour le traitement des dirs.

 #!/bin/sh for i in "$@"; do find "$i" -type f -exec touch -r {} -d '+3 hour' {} \; done 

Vous pouvez l'exécuter comme ceci:

 ./script.sh /path/to/dir1 /path/to/dir2 

La réponse correcte et complète est la suivante:

Pour modifier le time d'access uniquement avec la command " touch ", vous devez utiliser le paramètre " -a ", sinon la command modifiera également l'heure de modification. Par exemple, pour append 3 heures:

 touch -a -r test_file -d '+3 hour' test_file 

Du toucher de l'homme:

 Update the access and modification times of each FILE to the current time. -a change only the access time -r, --reference=FILE use this files times instead of current time. -d, --date=STRING parse STRING and use it instead of current time 

Ainsi, le file aura un time d'access égal à l'ancien time d'access plus 3 heures. Et le time de modification restra le même. Vous pouvez vérifier ceci avec:

 stat test_file 

Enfin, pour modifier le time d'access uniquement à un directory entier et à ses files et sous-directorys, vous pouvez utiliser la command " find " pour parcourir le directory et utiliser le paramètre " -exec " pour exécuter "touch" sur chaque file et directory la search avec l'argument "- type f ", cela n'affectera pas les directorys).

 find dir_test -exec touch -a -r '{}' -d '+3 hours' '{}' \; 

De l'homme find:

 -type c File is of type c: d directory f regular file 

et pour -exec:

 -exec command ; Execute command; true if 0 status is returned. All following arguments to find are taken to be arguments to the command until an argument consisting of ';' is encoun- tered. The ssortingng '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell. See the EXAMPLES section for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting directory. There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead. 

N'oubliez pas de placer les accolades dans des guillemets simples pour les protéger de l'interprétation en tant que ponctuation du script shell. Le point-virgule est également protégé par l'utilisation d'une barre oblique inverse, bien que des guillemets simples auraient pu être utilisés dans ce cas également.

Enfin, pour l'utiliser dans un script shell comme "yaegashi" a déclaré:

 #!/bin/sh for i in "$@"; do find "$i" -exec touch -a -r '{}' -d '+3 hours' '{}' \; done 

Et lancez-le comme "yaegashi" dit:

 ./script.sh /path/to/dir1 /path/to/dir2 

Il search dans tous les directorys de dir1 et dir2 et ne modifie que l'heure d'access pour chaque file et sous-directory.