2012-06-27 15 views
44

Sto provando a scrivere uno script bash. In questo script voglio che l'utente inserisca un percorso di una directory. Quindi voglio aggiungere alcune stringhe alla fine di questa stringa e creare un percorso per alcune sottodirectory. Per esempio assumere utente immette una stringa come questa:Come concatenare due stringhe per creare un percorso completo

/home/user1/MyFolder 

Ora voglio creare 2 sottodirectory in questa directory e copiare alcuni file lì.

/home/user1/MyFolder/subFold1 
/home/user1/MyFolder/subFold2 

Come posso fare questo?

+1

Cosa hai provato finora? Inoltre, fa parte della tua domanda su come ottenere input dall'utente, e l'altra parte sulla costruzione del percorso? O solo il percorso? – Levon

+0

Basta creare il percorso. – Hakim

risposta

9

Non semplicemente concatenando la parte del tuo percorso ottieni ciò che desideri?

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

è quindi possibile creare le cartelle/directory in base alle esigenze.

+3

perché ottengo questo messaggio: Myscript.sh: riga 4:/home/user1/MyFolder/subFold1: è una directory – Hakim

+1

Manca un/dal percorso. L'obiettivo è inline '/ home/user1/MyFolder/subFold1' quindi è necessario in linea' new_path = $ base/$ sottodir. '. Ma cosa fai se il percorso indicato include un "/" finale? – Thrasi

+1

@Thrasi basta aggiungere il "/" finale alla variabile subdir o 'newpath = $ base/$ sottodir /' Puoi giocare con questo direttamente sulla riga di 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 

E se si desidera utilizzare readline in modo da ottenere il completamento e tutto ciò che, aggiungere un -e alla chiamata alla read:

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

Sfortunatamente, questo non funziona quando BASEPATH è vuoto.Quello di cui ho bisogno è qualcosa di simile che aggiunge solo un/quando non è già finito di una barra E non è vuoto. Quindi, quando termina con un carattere di nome file legale. –

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

I mandati standard POSIX che più / vengono trattati come singolo / in un nome di file. Pertanto, //dir///subdir////file corrisponde a /dir/subdir/file.

Come tale concatenazione di un due stringhe per costruire un percorso completo è un semplice esempio:

full_path="$part1/$part2" 
+2

Tranne se $ part1 può essere una stringa vuota. –

+1

@TuureLaurinolli Non capisco da dove vieni. La concatenazione di cui sopra risulterebbe comunque in un percorso valido. Il percorso potrebbe non esistere, ma sarebbe comunque valido. per esempio. '" "+"/"+" Documenti "' dà '"/Documenti "'. – Dunes

+5

Se le parti stesse sono percorsi relativi e la parte 1 può essere vuota, il risultato potrebbe passare dal percorso relativo a quello assoluto. –

3

Lo script che segue catenates diversi percorsi (relativo/assoluto) (BasePath) con un percorso relativo (SUBDIR):

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

la cui uscita è:

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 

Il shopt -s extglob è necessario solo per consentire a BASEPATH di terminare con più barre (che probabilmente non ha senso). Senza esteso le wildcard si può semplicemente utilizzare:

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

che si tradurrebbe in meno ordinata, ma ancora lavorando:

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