web-dev-qa-db-fra.com

Comment obtenir le dernier fichier à partir d'une liste de fichiers dans un répertoire particulier

J'ai besoin d'obtenir le dernier fichier dans une liste de fichiers dans un répertoire particulier.

Lorsque j'exécute le script, la première fois que j'ai copié la liste des fichiers dans un répertoire particulier à un autre répertoire.

À partir de la deuxième course, j'ai besoin d'obtenir les derniers fichiers d'une liste de fichiers dans le même répertoire pour copier ces fichiers dans l'autre répertoire.

Ici, dans la première course, je capture la date de création du dernier fichier dans une variable, lorsque le script est exécuté une seconde fois, des fichiers supérieurs à la dernière date de création de fichier lors de la première exécution; Ces fichiers doivent être copiés dans l'autre répertoire.

S'il vous plaît quelqu'un pourrait-il m'aider à obtenir les derniers fichiers?

8
Abbireddy
ls -t1 |  head -n 1

La première répertorie tous les fichiers commandés par heure d'accès, ce dernier sélectionne la première ligne.

22
Thomas Stuefe

Si vous ne faites que copier des fichiers d'un répertoire à un autre en fonction de leurs délais de modification, vous pourriez envisager rsync. Un moyen très simple de faire la même chose pourrait être:

rsync -t ./dir1/ ./dir2/

Ou juste pour voir ce qu'il ferait ajouter:

rsync -t --list-only ./dir1/ ./dir2/

Comme Gilles notes dans un commentaire ci-dessous, il peut exister des circonstances atténuantes qui évitent l'utilisation de la -t option pour vous. Mais si vous prenez quelque chose à ce sujet, laissez-le, c'est que vous CAN et devrait tester pour les résultats que vous désirez et que rsync 's --list-only L'option est un moyen très simple de le faire.

Aussi, peut-être ...

man rsync
4
mikeserv

Dans ZSH, le dernier fichier de l'annuaire actuel est

a=(*(om[1]))
latest_file=$a[1]
cp -p $latest_file /other/directory

(- Glob Qualifiers Rock, mais malheureusement, le résultat est toujours une liste même si vous ne demandez qu'un élément, d'où le tableau temporaire a.)

Dans d'autres coquilles, si vous savez que vos noms de fichiers ne peuvent pas contenir de nouvelles lignes ou de caractères non transmissibles, vous pouvez utiliser ls:

latest_file=$(ls -t | head -n 1)
cp -p "$latest_file" /other/directory

Cependant, il semble que ce que vous demandez réellement est la liste des fichiers plus récents qu'un fichier particulier. Pour cela, vous pouvez utiliser -cnewer intégré de find Pour détecter les fichiers dont le contenu ou les métadonnées a changé plus récemment que certains autres fichiers. Notez que la façon dont je l'invoque ici, find collecte également des fichiers dans des sous-répertoires.

find . -cnewer "$previous_latest_files" -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +

Le problème reste à détecter le dernier dossier précédent ... En fait, quelle importance est la date de la copie. Donc, créez un fichier de marqueur lorsque vous effectuez la copie.

find . -cnewer marker_file -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
touch marker_file

Si les fichiers restent dans le répertoire cible, vous pouvez simplement synchroniser les deux répertoires. Notez que si vous supprimez certains anciens fichiers du répertoire cible, mais ils restent dans le répertoire source, ils seront à nouveau copiés avec cette méthode.

rsync -a . /other/directory/

Si votre objectif réel est de déplacer un tas de fichiers en fonction du temps de modification et de la version de votre système de find prend en charge la -newerXY Type de tests, vous pouvez faire quelque chose comme

find -type f -newermt "@$lasttime" -exec mv -t path/to/destination/ {} +

$lasttime est la durée de modification de fichier que vous avez enregistrée précédemment, en quelques secondes depuis que EPOCH (par exemple, à partir de stat -c %Y yourfile).

Vous pouvez également utiliser find -newer somefile ou find -newermm somefile Pour comparer les temps de modification à celle d'un fichier de référence directement, au lieu de sauvegarder l'horodatage du fichier de référence dans une variable.

Pour limiter la sélection au répertoire actuel (exclure les sous-répertoires), vous pouvez ajouter -maxdepth 1 à la commande find.

3
steeldriver