répertorier tous les fichiers plus récents que l'horodatage donné et les trier

8

Je veux lister tous les fichiers (triés par date) qui sont plus récents que l' horodatage au format 20130207003851dans le répertoire / tmp uniquement. Les sous-répertoires peuvent être omis.

Utilisation de SUSE Linux Enterprise Server 11.

Le format de sortie doit être

S0002948.LOG Feb  7 03:28 
S0002935.LOG Feb  7 05:58 
S0002952.LOG Feb  7 09:58 
S0002940.LOG Feb  7 11:58 

find / tmp -newermt "7 feb 2013" -ls liste les fichiers que je veux mais

  • comment utiliser l'horodatage au format 20130207003851
  • comment trier la sortie?
  • comment afficher uniquement le nom et la date du fichier. Nom du fichier d'abord et ensuite la date?

ps je ne veux pas utiliser le toucher pour créer un fichier de référence pour trouver

pss

find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
Radek
la source
Qu'est-ce qui est 2013007000385censé représenter? Je suppose que 2013 est l'année, mais comment allez-vous du 0070003857 février?
Gilles 'SO- arrête d'être méchant' le
@Gilles: Censé être 20130207003851. Je ne l'ai pas copié correctement ou ... désolé pour ça.
Radek

Réponses:

10

findprend en charge de nombreux formats de saisie de date . Le format le plus simple à obtenir est AAAAMMJJ HH: MM: SS. Vous avez déjà les chiffres dans le bon ordre, tout ce que vous avez à faire est d'extraire le premier groupe ( ${timestamp%??????}: prendre tous sauf les 6 derniers caractères;: ${timestamp#????????}prendre tous sauf les 8 premiers caractères), et continuer, en ajoutant la ponctuation puis le groupe suivant au fur et à mesure.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

En bash (et ksh et zsh), mais pas dans ash, vous pouvez utiliser la ${STRING_VARIABLE:OFFSET:LENGTH}construction plus lisible .

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

Pour trier les fichiers par date, imprimez les noms de fichiers précédés des dates et triez-les, puis supprimez le préfixe de date. Utilisez -printfpour contrôler le format de sortie. imprime une partie du temps de modification déterminé par ; si c'est le cas , vous obtenez le nombre de secondes depuis l'époque Unix. Ci-dessous, j'imprime trois colonnes séparées par des tabulations: l'heure au format triable, le nom du fichier et l'heure au format lisible par l'homme; supprime la première colonne et l'appel pour remplacer l'onglet par suffisamment d'espaces pour accueillir tous les noms de fichiers attendus (ajustez 40 comme vous le souhaitez). Ce code suppose que vous n'avez pas de nouvelles lignes ou d'onglets dans les noms de fichiers.%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40
Gilles 'SO- arrête d'être méchant'
la source
seule la partie trouver find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'me donne une sortie amusante-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek
@Radek Désolé, c'est %Tpour le mtime, ce %Msont les permissions.
Gilles 'SO- arrête d'être méchant'
Beau. Fonctionne en douceur. Mon code final est find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-le nom et l'heure du fichier séparé, -car je vais capturer la sortie en php et l'utiliser - comme séparateur. Merci beaucoup.
Radek
@Gilles c'est génial, mais si vous expliquez timestring, cela vous aidera davantage ..
Rahul Patil
@RahulPatil Done. J'ai également ajouté une méthode bash plus lisible.
Gilles 'SO- arrête d'être méchant'
5

Avec zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

Les newerretours de fonction vrai pour les fichiers plus récents que $timestamp(notez que zshl » zstatne supporte pas la précision subsecond bien).

Ensuite, tout ce que nous faisons est d'utiliser des zshqualificatifs globbing: Dpour inclure des fichiers dot, .pour ne considérer que les fichiers normaux, Ompour commander au moment de la modification et +newerpour appeler la newerfonction pour déterminer le fichier à sélectionner.

Si vous souhaitez également afficher les horodatages du fichier, vous pouvez passer newerà:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Notez cependant que le résultat de la génération du nom de fichier inclura les horodatages, ce qui signifie que vous ne pouvez plus les utiliser comme noms de fichiers.

Stéphane Chazelas
la source
cela ne fonctionnera pas ssh, par exemple.
evandrix