2017-09-20 7 views
0

pas sûr de savoir comment le titre correctement cela, s'il vous plaît changer si vous préférezmeilleure façon d'éviter l'utilisation de ls à l'intérieur de la variable

étant donné que mon code fonctionne réellement, j'aimerais avoir un examen par les pairs pour augmenter la qualité de celui-ci.

J'ai un dossier complet de fichiers .zip. Ces fichiers sont des flux de données (identifiables par leur nom de flux) déchargés quotidiennement. Il pourrait y avoir plus d'un fichier journalier par flux, j'ai donc besoin de récupérer le dernier par ordre de temps. Je ne peux pas compter sur l'horodatage posix pour cela, donc les fichiers exposent l'horodatage de leur nom.

exemple Nom du fichier: XX_XXYYZZ_XYZ_05_AB00C901_T001_20170808210052_20170808210631.zip

  • Les deux derniers champs sont horodatages, et je suis intéressé par le -dernière.
  • autres champs sont inutiles (aujourd'hui)

Je l'ai déjà enregistré le nom de flux (dans ce cas XYZ_05_AB00C901_T001 dans la variable $stream

Je cette ligne de code:

match=$(ls "$streamPath"/*.zip|grep "$stream"|rev|cut -d'_' -f2|rev|sort|tail -1)

Et ce qu'il fait est de rechercher le chemin donné pour les fichiers correspondant au flux, en découpant l'horodatage et en les triant.Maintenant que je sais quel est le dernier ti mestamp pour ce flux, je peux ls à nouveau, cette fois grep pour $stream et $match togegher, et je suis fait:

streamFile=$(ls "$streamPath"/.zip|grep "$stream.*$match\|$match.*$stream")

temps Question:

  • Y at-il une meilleure façon de atteindre mon but ? Probablement plus d'un, je vais préférer une solution de doublure, difficile.

  • ShellChecks me conseils qu'il serait préférable d'utiliser une boucle for ou un cycle while au lieu de ls, pour être en mesure de gérer les noms de fichiers particuliers (que je ne suis pas face à l'ATM, mais qui sait), mais je Je n'en suis pas si sûr (cela me semble plus compliqué).

Merci.

O.

+2

Affiche l'exemple de sortie pour 'ls', ainsi que la sortie attendue de la commande. – 123

+0

Vous voudrez peut-être rédiger vos échantillons de manière plus complète et demander une critique sur [codereview.se]. Assurez-vous de lire [Un guide de révision de code pour les utilisateurs de Stack Overflow] (// codereview.meta.stackexchange.com/a/5778) d'abord, car certaines choses sont faites différemment là-bas! –

+0

est ce timestamp reflète l'heure réelle de modification du fichier? – RomanPerekhrest

Répondre

-1

Merci à la page proposée par Cyrus que j'ai choisi d'aller avec cette solution:

while IFS= read -r -d '' file; do echo "$file"|grep "$stream"|rev|cut -d'_' -f2|rev|sort|tail -1 done < <(find "$streamPath" -maxdepth 1 -type f -name '*.zip' -print0)

Merci !!

+0

pourquoi downvote ??? – Omar