Comment savoir si le fichier dans une boucle est le dernier?
Exemple
for FILE in $DIR/*
do
if(<is last File>)
doSomethingSpecial($FILE)
else
doSomethingRegular($FILE)
fi
done
Ce qu'il faut appeler pour <is last file>
pour vérifier si le fichier en cours est le dernier de la matrice ?
Est-il un simple haut-check sans vérification de la longueur du tableau par moi-même ?
source d'informationauteur John Threepwood | 2012-09-06
Vous devez vous connecter pour publier un commentaire.
Ce qu'il faut appeler pour vérifier si le fichier en cours est le dernier de la matrice ?
Pour commencer, vous n'êtes pas à l'aide d'un tableau. Si vous étiez alors il serait facile:
Je ne connais aucun moyen de dire que vous traitez le dernier élément d'une liste dans une boucle for. Cependant, vous pouvez utiliser un tableau, une itération sur tous, mais le dernier élément, et ensuite traiter le dernier élément en dehors de la boucle:
L'expansion
${files[@]:offset:length}
évalue à tous les éléments de départ àoffset
(ou le début si vide) pourlength
éléments.${#files[@]}-1
est le nombre d'éléments dans le tableau moins 1.${files[@]: -1:1}
renvoie le dernier élément de -1 à partir de la fin d'une longueur de 1. L'espace est nécessaire que:-
est traité différemment à: -
.Essayer cette
Produit
Ce qui rend un fichier le dernier? Est-il quelque chose de spécial à ce sujet? Est-ce le fichier avec le nom le plus quand triés par nom?
Peut-être vous pouvez prendre les noms de fichier en arrière. Puis, c'est le premier fichier que vous souhaitez traiter spéciaux et pas la dernière. déterminer la première est une tâche beaucoup plus facile que de faire le dernier:
Pas de tableaux nécessaires. En fait, j'aime chepner's réponse sur l'utilisation de paramètres positionnels.
Vous pouvez utiliser recherche pour trouver le nombre total de fichiers.
Puis, quand vous êtes dans la boucle de comptage du nombre total et de la mener à bien votre tâche lorsque le total est égal le comte, je.e, le dernier fichier.
Vous pouvez abuser de la position des paramètres, car ils agissent de la même façon à un tableau,
mais qui sont un peu plus facile à manipuler. Vous devez enregistrer le vieux de position
paramètres, ou à exécuter dans un shell interne est exécuté.
Bâtiment sur le courant plus-voté réponse de @cdarke (https://stackoverflow.com/a/12298757/415523), si en regardant un tableau général des valeurs (plutôt que spécifiquement des fichiers sur le disque), la boucle de code serait comme suit:
Cela donne le résultat:
Cela garantit que seuls les dernier élément dans le tableau déclenche l'action alternative et que, si tout autre élément dans le tableau reproduit la dernière valeur, l'action alternative est pas appelé au plus tôt les doublons.
Dans le cas d'un tableau de chemins de fichiers dans un répertoire spécifique, par exemple
...c'est sans doute moins problématique, puisque les noms de fichiers dans le même répertoire sont presque certainement unique (sauf si vous avez un vraiment étrange système de fichiers!)
C'est une vieille question, mais en s'appuyant sur la réponse de @GregReynolds veuillez utiliser ce one-liner si les commandes ne diffèrent que par des paramètres sur la dernière passe. Laid, laid code pour one-liner amateurs de
( ff="" ; for f in * "" ; do [ -n "$ff" ] && echo $(${f:+false} && echo $ff alternate params here || echo normal params $ff ) ; ff=$f ; done )
normal params 1
normal params 2
normal params 3
4 alternate params here