J'essaye d'écrire un script bash. Dans ce script, je souhaite que l'utilisateur saisisse le chemin d'un répertoire. Ensuite, je veux ajouter des chaînes à la fin de cette chaîne et créer un chemin vers certains sous-répertoires. Par exemple, supposons que l'utilisateur entre une chaîne comme celle-ci:
/home/user1/MyFolder
Maintenant, je veux créer 2 sous-répertoires dans ce répertoire et y copier quelques fichiers.
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
Comment puis-je faire ceci?
Réponses:
La norme POSIX exige que plusieurs
/
soient traités comme un seul/
dans un nom de fichier. Ainsi//dir///subdir////file
est le même que/dir/subdir/file
.En tant que tel, concaténer deux chaînes pour créer un chemin complet est un simple comme:
la source
"" + "/" + "Documents"
donne"/Documents"
../
à l'avant. Mais peut-être que l'utilisateur souhaite concater des chemins absolus. Sinon, ils pourraient simplement s'ajouter./
à l'avant pour forcer le chemin à être relatif. Notez également que"$path1/./$path2"
c'est la même chose que"$path1/$path2"
.Et si vous souhaitez utiliser readline pour obtenir la complétion et tout cela, ajoutez un
-e
à l'appel àread
:la source
La simple concaténation de la partie de votre chemin n'accomplira-t-elle pas ce que vous voulez?
Vous pouvez ensuite créer les dossiers / répertoires selon vos besoins.
Une convention est de terminer les chemins de répertoire par
/
(par exemple/home/
) parce que les chemins commençant par / pourraient être confondus avec le répertoire racine. Si une double barre oblique (//
) est utilisée dans un chemin, elle est également toujours correcte. Mais, si aucune barre oblique n'est utilisée sur l'une ou l'autre des variables, ce serait incorrect (par exemple/home/user1/MyFoldersubFold1
).la source
/home/user1/MyFolder/subFold1
, vous auriez donc besoin en lignenew_path=$base/$subdir
. Mais alors que faites-vous si le chemin donné comprend un '/' de fin?newpath=$base/$subdir/
vous pouvez jouer avec ceci directement sur la ligne de commandeLe script suivant catène plusieurs chemins (relatifs / absolus) (BASEPATH) avec un chemin relatif (SUBDIR):
La sortie est:
Le
shopt -s extglob
n'est nécessaire que pour permettre à BASEPATH de se terminer sur plusieurs barres obliques (ce qui est probablement absurde). Sans globalisation étendue, vous pouvez simplement utiliser:ce qui se traduirait par le moins soigné mais fonctionnant toujours:
la source
Je travaillais avec mon script shell qui doit faire des trucs de jonction de chemin comme vous le faites.
Le truc c'est que les deux chemins aiment
sont valides.
Si je veux ajouter un fichier à ce chemin comme
il n'y avait pas de méthode native (comme os.path.join () en python) dans le shell pour gérer une telle situation.
Mais j'ai trouvé un truc
Par exemple, le chemin de base était stocké dans une variable shell
et le dernier nom de fichier que vous souhaitez rejoindre était
Ensuite, vous pouvez attribuer votre nouveau chemin comme ceci
et alors vous obtiendrez
la raison est très simple, la commande "realpath" réduirait toujours la barre oblique de fin pour vous si nécessaire
la source
la source
Cela devrait fonctionner pour un répertoire vide (vous devrez peut-être vérifier si la deuxième chaîne commence par
/
laquelle doit être traitée comme un chemin absolu?):Production:
Référence: Extension des paramètres du shell
la source