Estoy intentando escribir un script bash. En este script, quiero que el usuario ingrese la ruta de un directorio. Luego, quiero agregar algunas cadenas al final de esta cadena y construir una ruta a algunos subdirectorios. Por ejemplo, suponga que el usuario ingresa una cadena como esta:
/home/user1/MyFolder
Ahora quiero crear 2 subdirectorios en este directorio y copiar algunos archivos allí.
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
¿Cómo puedo hacer esto?
Respuestas:
El estándar POSIX exige que varios
/
se traten como uno solo/
en un nombre de archivo. Así//dir///subdir////file
es lo mismo que/dir/subdir/file
.Como tal, concatenar dos cadenas para construir una ruta completa es tan simple como:
fuente
"" + "/" + "Documents"
da"/Documents"
../
al frente. Pero tal vez el usuario quiera concatizar rutas absolutas. De lo contrario, podrían simplemente agregar./
al frente para forzar que la ruta sea relativa. También tenga en cuenta que"$path1/./$path2"
es lo mismo que"$path1/$path2"
.Y si desea usar readline para completar y todo eso, agregue
-e
a la llamada aread
:fuente
¿No logrará simplemente concatenar la parte de su camino lo que desea?
A continuación, puede crear las carpetas / directorios según sea necesario.
Una convención es terminar las rutas de directorio con
/
(por ejemplo/home/
) porque las rutas que comienzan con / podrían confundirse con el directorio raíz. Si//
se usa una barra doble ( ) en una ruta, también es correcta. Pero, si no se usa una barra en ninguna de las variables, sería incorrecta (por ejemplo/home/user1/MyFoldersubFold1
).fuente
/home/user1/MyFolder/subFold1
por lo que necesitaría en líneanew_path=$base/$subdir
. Pero entonces, ¿qué haces si la ruta dada incluye un '/' final?newpath=$base/$subdir/
puede jugar con esto directamente en la línea de comandoEl siguiente script categoriza varias rutas (relativas / absolutas) (BASEPATH) con una ruta relativa (SUBDIR):
El resultado del cual es:
los
shopt -s extglob
solamente es necesario para permitir BASEPATH para terminar en múltiples barras (que es probablemente sin sentido). Sin globular extendido, solo puede usar:lo que resultaría en el menos ordenado pero aún funcionando:
fuente
Estaba trabajando con mi script de shell que necesita hacer algunas cosas de unión de ruta como lo hace usted.
La cosa es que ambos caminos como
son validos.
Si quiero agregar un archivo a esta ruta como
no había un método nativo (como os.path.join () en python) en shell para manejar tal situación.
Pero encontré un truco
Por ejemplo, la ruta base se almacenó en una variable de shell
y el último nombre de archivo al que te quieres unir era
Entonces puedes asignar tu nueva ruta así
y luego obtendrás
la razón es muy simple, el comando "realpath" siempre recorta la barra final si es necesario
fuente
fuente
Esto debería funcionar para un directorio vacío (es posible que deba verificar si la segunda cadena comienza con la
/
que debe tratarse como una ruta absoluta):Salida:
Referencia: Expansión de parámetros de shell
fuente