J'essaye d'utiliser awk
pour obtenir le nom d'un fichier étant donné le chemin absolu vers le fichier.
Par exemple, quand on /home/parent/child/filename
me donne le chemin d'entrée que je voudrais obtenir, filename
j'ai essayé:
awk -F "/" '{print $5}' input
qui fonctionne parfaitement.
Cependant, je suis un codage en dur $5
qui serait incorrect si mon entrée a la structure suivante:
/home/parent/child1/child2/filename
Une solution générique nécessite donc de toujours prendre le dernier champ (qui sera le nom du fichier).
Existe-t-il un moyen simple de faire cela avec la fonction awk substr?
basename
est la façon officielle de le faire, utiliserawk
pour cela n'est pas bon de le dire à la légère. : DRéponses:
Utilisez le fait qui
awk
divise les lignes en champs en fonction d'un séparateur de champ, que vous pouvez définir. Par conséquent, en définissant le séparateur de champ,/
vous pouvez dire:comme se
NF
réfère au nombre de champs de l'enregistrement en cours, l'impression$NF
signifie l'impression du dernier.Donc, étant donné un fichier comme celui-ci:
Ce serait la sortie:
la source
$(NF-1)
.Dans ce cas, il vaut mieux utiliser
basename
au lieu deawk
:la source
dirname
fait le contraire et supprime le fichier et non le chemin.Une autre option consiste à utiliser la
bash
substitution de paramètres .la source
Si vous êtes ouvert à une solution Perl, en voici une similaire à la solution awk de fedorqui:
-F/
spécifie/
que le séparateur de champ$F[-1]
est le dernier élément du@F
tableau autosplitla source
Cela devrait être un commentaire à la réponse du nom de base, mais je n'ai pas assez de point.
Si vous n'utilisez pas de guillemets doubles,
basename
ne fonctionnera pas avec un chemin contenant un espace:ok avec guillemets ""
exemple de fichier
la source
Je sais que j'ai environ 3 ans de retard sur ce point, mais ... vous devriez envisager l'expansion des paramètres, elle est intégrée et plus rapide.
si votre entrée est dans un var, disons, $ var1, faites simplement
${var1##*/}
. Regardez ci-dessousla source
Comme 5 ans de retard, je sais, merci pour toutes les propositions, j'avais l'habitude de le faire de la manière suivante:
Heureux de constater qu'il y a de meilleures manières
la source
Vous pouvez aussi utiliser:
ou
la source