Comment copier le dernier fichier modifié avec une date donnée en utilisant les commandes shell unix?

Je dois écrire un script shell qui doit copier le dernier fichier dans un répertoire cible. J’utilise la commande shell suivante.

find . -type f -daystart -mtime -$dateoffset 

Il me donne le dernier ensemble de fichiers. Mais je dois obtenir le dernier fichier de cette liste et le copier dans un répertoire cible.

Merci.

Je ne peux pas penser à une façon de faire cela dans Bourne Shell, puisque vous devez utiliser un outil qui lit réellement les horodatages et les sortinge, et le shell Bourne ne le fait pas.

Mais voici une solution en PHP:

  

Et si vous voulez utiliser bash à la place de Bourne, il s’agit d’une méthode complète pour obtenir ce que vous voulez en utilisant un tableau associatif:

 #!/usr/local/bin/bash declare -A fdate highest=0 for file in *; do timestamp=$(stat -f '%m' "$file") fdate[$timestamp]="$file" if [ "$timestamp" -gt "$highest" ]; then highest=$timestamp fi done printf "Newest file: %s\n" "${fdate[$highest]}" 

Notez que j’utilise FreeBSD, donc cette solution fonctionnera également sous OSX, mais si vous utilisez Linux, vous devrez déterminer en quoi votre implémentation de la commande stat différente de la mienne. (Astuce: vous pouvez peut-être utiliser stat -c '%y' , mais man stat pour être sûr. Solaris, HP / UX, OSF / 1, etc. ne semblent pas inclure de stat pouvant être appelées depuis votre shell .)

Mise à jour: La solution soignée de @ ghoti est recommandée par rapport à celle-ci. Ce qui suit a été prouvé non robuste. Ce n’est que parce que, comme réponse partielle, cela pourrait ouvrir la voie vers une meilleure solution sur une ligne.

 ls -1dt $(find . -type f -daystart -mtime -$dateoffset) | head -n1 

Pour copier le fichier dans $ TARGET_DIR,

 A=$(ls -1dt $(find . -type f -daystart -mtime -$dateoffset) | head -n1) if [ -n "$A" ] cp -u "$A" "$TARGET_DIR/$(basename $A)" 
 find . -name "*" -type f -daystart -mtime -$dateoffset | xargs -i mv {} /where/to/put/files 

ou

 mv `find . -name "*" -type f -daystart -mtime -$dateoffset` /where/to/put/files 

Si vous utilisez la commande ls avec l’option -lt, cela vous donnera le fichier le plus récent. Donc, en utilisant cela, vous pouvez facilement extraire le dernier nom de fichier

Vous pouvez utiliser quelque chose comme ceci:

 find . -type f -name "*" -mtime +x_NUMBER_OF_DAYS|ls -lrt|awk -F' ' '{print $(COLUMN_NUMBER_IN_WHICH_FILE_NAME_APPEARS)}'|tail -1 

Cela vous donnera le dernier fichier jusqu’à une date donnée.

Comme quelqu’un l’a suggéré ci-dessus, daystart n’est présent que dans la version GNU de find alors que -mtime est une commande plus générique.

PS: Cela souffre à nouveau d’un problème d’parsing si le nom du fichier contient de l’espace. Mais jusqu’à ce que nous trouvions quelque chose de plus créatif, vous pouvez l’utiliser!