2017-09-26 1 views
0

J'ai préparé un script bash pour obtenir seulement le répertoire (pas le chemin complet) avec le nom du fichier où le fichier est présent. Cela doit être fait seulement quand le fichier est situé dans le sous-répertoire. Par exemple: si l'entrée est src/email/${sub_dir}/Bank_Casefeed.email, la sortie doit être ${sub_dir}/Bank_Casefeed.email.Récupère le répertoire courant (pas le chemin complet) avec le nom de fichier uniquement quand le sous-dossier est présent dans Linux bash

Si l'entrée est src/layouts/Bank_Casefeed.layout, la sortie doit être Bank_Casefeed.layout. Je peux facilement obtenir ceci en utilisant la commande basename.

src/basefolder est toujours constant. Dans certains cas (après le répertoire src/email (basefolder)), sub_directories sera là.

Ce script fonctionnera. Je peux utiliser ce script (seulement si le module est e-mail) pour obtenir la sortie. mais le script devrait fonctionner même si le sous-répertoire est présent dans d'autres modules. Peut-être devrais-je compter les répertoires? s'il y a plus de deux répertoires (src/basefolder), le script devrait avoir des sous-répertoires. Y a-t-il une meilleure façon de gérer les deux scénarios?

#!/bin/bash 
filename=`basename src/email/${sub_dir}/Bank_Casefeed.email` 
echo "filename is $filename" 

fulldir=`dirname src/email/${sub_dir}/Bank_Casefeed.email` 
dir=`basename $fulldir` 
echo "subdirectory name: $dir" 

echo "concatenate $filename $dir" 
Entity=$dir/$filename 
echo $Entity 

Répondre

1

Je sais qu'il pourrait y avoir un moyen plus facile de le faire. Mais je crois que vous pouvez simplement manipuler la chaîne d'entrée. Par exemple:

#!/bin/bash 

sub_dir='test' 
DIRNAME1="src/email/${sub_dir}/Bank_Casefeed.email" 
DIRNAME2="src/email/Bank_Casefeed.email" 

echo $DIRNAME1 | cut -f3- -d'/' 
echo $DIRNAME2 | cut -f3- -d'/' 

Cela supprimera les deux premiers répertoires.

2

Utilisation de l'extension des paramètres shell:

sub_dir='test' 
files=("src/email/${sub_dir}/Bank_Casefeed.email" "src/email/Bank_Casefeed.email") 

for f in "${files[@]}"; do 
    if [[ $f == *"/$sub_dir/"* ]]; then 
     echo "${f/*\/$sub_dir\//$sub_dir\/}" 
    else 
     basename "$f" 
    fi 
done 
test/Bank_Casefeed.email 
Bank_Casefeed.email 
+0

Merci glenn. sub_dir peut être n'importe quoi. Les fichiers sont créés pendant l'exécution par un autre script. Le nom sub_dir ne peut donc pas être défini dans ce script. Juste une liste de fichiers dans le fichier texte. Y a-t-il un moyen de gérer cela? – Ela

+0

Je ne comprends pas comment ce commentaire correspond à votre question. Est-ce que cela aide: http://mywiki.wooledge.org/BashFAQ/001 –