2012-06-27 23 views
44

Estoy intentando escribir una secuencia de comandos bash. En este script, quiero que el usuario ingrese una ruta de un directorio. Luego quiero agregar algunas cadenas al final de esta cadena y crear una ruta a algunos subdirectorios. Por ejemplo asumen usuario introduce una cadena como esta:Cómo concatenar dos cadenas para compilar una ruta completa

/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?

+1

¿Qué has intentado hasta ahora? Además, ¿es parte de su pregunta sobre cómo obtener información del usuario y la otra sobre cómo crearla? ¿O solo el camino? – Levon

+0

Simplemente creando la ruta. – Hakim

Respuesta

9

¿No logrará simplemente concatenar la parte de su camino lograr lo que quiere?

$ base="/home/user1/MyFolder" 
$ subdir="subFold1" 
$ new_path=$base$subdir 
$ echo $new_path 
/home/user1/MyFoldersubFold1 

puede crear las carpetas/directorios según sea necesario.

+3

por qué recibo este mensaje: Myscript.sh: línea 4:/home/user1/MyFolder/subFold1: Es un directorio – Hakim

+1

Falta un/de la ruta. El objetivo es en línea '/ home/user1/MyFolder/subFold1' por lo que necesitaría en línea' new_path = $ base/$ subdir'. Pero entonces, ¿qué haces si la ruta dada incluye un '/' posterior? – Thrasi

+1

@Thrasi simplemente agrega el final '/' a la variable subdir oa 'newpath = $ base/$ subdir /' Puedes jugar con esto directamente en la línea de comando – user12345

30
#!/bin/bash 

read -p "Enter a directory: " BASEPATH 

SUBFOLD1=${BASEPATH%%/}/subFold1 
SUBFOLD2=${BASEPATH%%/}/subFold2 

echo "I will create $SUBFOLD1 and $SUBFOLD2" 

# mkdir -p $SUBFOLD1 
# mkdir -p $SUBFOLD2 

Y si desea utilizar readline para que pueda obtener la terminación y todo eso, agrega un -e a la llamada a read:

read -e -p "Enter a directory: " BASEPATH 
+0

Desafortunadamente, esto no funciona cuando BASEPATH está vacío.Lo que necesito es algo así que solo agrega un/cuando todavía no termina una barra Y no está vacío. Por lo tanto, cuando termina en un carácter de nombre de archivo legal. –

0
#!/usr/bin/env bash 

mvFiles() { 
    local -a files=(file1 file2 ...) \ 
      subDirs=(subDir1 subDir2) \ 
      subDirs=("${subDirs[@]/#/$baseDir/}") 

    mkdir -p "${subDirs[@]}" || return 1 

    local x 
    for x in "${subDirs[@]}"; do 
     cp "${files[@]}" "$x" 
    done 
} 



main() { 
    local baseDir 
    [[ -t 1 ]] && echo 'Enter a path:' 
    read -re baseDir 
    mvFiles "$baseDir" 
} 

main "[email protected]" 
66

Los mandatos estándar POSIX que múltiples / son tratados como un solo / en un nombre de archivo. Por lo tanto, //dir///subdir////file es el mismo que /dir/subdir/file.

Como tal concatenando una dos cadenas para construir un camino completo es un simple como:

full_path="$part1/$part2" 
+2

Excepto si $ part1 puede ser una cadena vacía. –

+1

@TuureLaurinolli No entiendo de dónde vienes. La concatenación anterior todavía resultaría en una ruta válida. La ruta puede no existir, pero aún sería válida. p.ej. '" "+"/"+" Documentos "' da '"/Documentos "'. – Dunes

+5

Si las partes en sí mismas son rutas relativas, y la parte 1 puede estar vacía, entonces el resultado puede pasar de la ruta relativa a la absoluta. –

3

La siguiente secuencia de comandos catenates varios caminos (relativas/absolutas) (basePath) con una ruta relativa (SUBDIR):

shopt -s extglob 
SUBDIR="subdir" 
for BASEPATH in ''/base base/ base// /base /base/ /base//; do 
    echo "BASEPATH = \"$BASEPATH\" --> ${BASEPATH%%+(/)}${BASEPATH:+/}$SUBDIR" 
done 

La salida de los cuales es:

BASEPATH = "" --> subdir 
BASEPATH = "/" --> /subdir 
BASEPATH = "base" --> base/subdir 
BASEPATH = "base/" --> base/subdir 
BASEPATH = "base//" --> base/subdir 
BASEPATH = "/base" --> /base/subdir 
BASEPATH = "/base/" --> /base/subdir 
BASEPATH = "/base//" --> /base/subdir 

El shopt -s extglob solo es necesario para permitir que BASEPATH termine en barras múltiples (lo cual probablemente sea una tontería). Sin extendida globing sólo puede utilizar:

echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR 

lo que resultaría en menos ordenada pero sigue trabajando:

BASEPATH = "" --> subdir 
BASEPATH = "/" --> /subdir 
BASEPATH = "base" --> base/subdir 
BASEPATH = "base/" --> base/subdir 
BASEPATH = "base//" --> base//subdir 
BASEPATH = "/base" --> /base/subdir 
BASEPATH = "/base/" --> /base/subdir 
BASEPATH = "/base//" --> /base//subdir 
Cuestiones relacionadas