Comment puis-je déplacer ou supprimer des fichiers créés dans certaines plages de temps?

0

Je fais des séquences de laps de temps qui durent plusieurs semaines et que je veux supprimer des photos prises pendant la nuit (c’est-à-dire entre 22h45 et 17h00 dans ce cas), comment puis-je le faire facilement?

J'ai trouvé les solutions partielles suivantes:

  • En utilisant find -newerXY et spécifiquement -newermt serait possible mais nécessite que je passe en boucle sur toutes les dates,
  • En utilisant stat pour interroger le mtime, mais je ne sais pas comment comparer facilement les temps en bash.

Je le fais maintenant manuellement, mais je suis sûr qu'il doit y avoir une solution plus élégante. Des idées? Merci! :)

Tim
la source

Réponses:

1

Avec stat (assume tous les fichiers dans le même répertoire)

stat -c '%y %n' * | grep -E ' (22:4[5-9]|22:5|23:|0[0-4]:)' | cut -d ' ' -f 4 | xargs mv -t $dirForRemovedFiles
  • cela suppose que dans la sortie de stat ne dépend pas de la locale (cela ne semble pas être ...), sinon forcez la locale à "C".
  • cela suppose que tous les fichiers se trouvent dans le même segment DST.
  • notez l'espace entre la citation et la parenthèse, c'est ce qui fait que l'expression rationnelle correspond uniquement au début de l'horodatage.
  • Pour des raisons de sécurité, la commande ci-dessus ne supprime rien, elle déplace simplement les fichiers dans un répertoire dans lequel rm * une fois que vous avez affirmé que rien ne vous manque.
  • si vous êtes paranoïaque, utilisez grep -E '^.{10} (22:4[5-9]|22:5|23:|0[0-4]:)' pour éviter les faux coups.
xenoid
la source
Attention: cela a peut-être fonctionné pour l'OP, mais il convient de noter que s'il existe un fichier avec une chaîne correspondante (par exemple, foo 23:bar ) dans son nom de fichier alors il sera déplacé indépendamment de son heure. Un autre problème: un fichier correspondant dont le nom de fichier contient une nouvelle ligne ne sera pas déplacé, je pense.
Kamil Maciorowski
Le réglage de l’expression rationnelle a été laissé à la discrétion du lecteur. Si vous avez des fichiers avec des nouvelles lignes dans leurs noms, vous avez un système très désolant et beaucoup d'autres problèmes à résoudre avant de vous poser des questions à ce sujet :)
xenoid
1

Cette ligne semi-simple imprimera les fichiers "nocturnes":

( \
llimit=$((60*5+0)); \
ulimit=$((60*22+45)); \
find -type f -exec bash -c '\
hm=`stat -c "%y" "$0" | cut -c 12-16`; \
t=$((60*10#`echo $hm | cut -c 1-2`+10#`echo $hm | cut -c 4-5`)); \
test \( $t -lt $1 \) -o \( $t -gt $2 \)' \
{} $llimit $ulimit \; \
-print \
)

Sous-lignes expliquées:

  1. Démarre un sous-shell pour rendre les variables locales.
  2. Calcule la limite inférieure en minutes après minuit.
  3. Calcule la limite supérieure.
  4. Un fichier séparé bash est exécuté; ça va faire l'arithmétique.
  5. Extraits mtime comme HH:MM.
  6. Convertit HH:MM à une valeur en minutes après minuit.
  7. Compare cette valeur avec des limites précalculées.
  8. Ce sont des arguments à l'intérieur bash; à l'intérieur, ils sont appelés $0, $1, $2.
  9. Imprime le chemin si le test précédent renvoie vrai.
  10. Termine le sous-shell.

Quelques remarques:

  • -exec peut servir de test dans find invocation. C'est à peine évident, pourtant très puissant. Dans ce cas, le test est vrai lorsque la dernière partie de l'intérieur bash ligne de commande (i.e. test ) renvoie true (c'est-à-dire que son statut de sortie est 0 ).
  • Arithmétique Bash ( $((…)) ) analyse 01 ou alors comme un nombre octal, 08 et 09 sont des nombres octaux invalides. C'est pourquoi nous devons utiliser 10# faire en sorte que tous les chiffres extraits de stat les résultats sont interprétés comme décimaux.
  • j'ai utilisé -lt et -gt dans test. Utilisation -le et / ou -ge si cela vous convient mieux.
  • Pour supprimer des fichiers, remplacez -print avec -delete (ou les utiliser ensemble: -print -delete ).
  • Pour déplacer les fichiers dans un seul répertoire, remplacez -print avec -print0 et construisez un tuyau comme ceci:

    ( … find … -print0 ) | xargs -0r mv -t /target/directory/
    
Kamil Maciorowski
la source