2012-06-27 32 views
44

Tôi đang cố gắng viết một tập lệnh bash. Trong tập lệnh này, tôi muốn người dùng nhập đường dẫn của một thư mục. Sau đó, tôi muốn nối thêm một số chuỗi ở cuối chuỗi này và tạo đường dẫn đến một số thư mục con. Ví dụ giả định người dùng nhập vào một chuỗi như thế này:Làm thế nào để nối hai chuỗi để tạo một đường dẫn hoàn chỉnh

/home/user1/MyFolder 

Bây giờ tôi muốn tạo 2 thư mục con trong thư mục này và sao chép một số tập tin đó.

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

Tôi làm cách nào để thực hiện việc này?

+1

bạn đã làm gì cố gắng cho đến nay? Ngoài ra, là một phần của câu hỏi của bạn về việc nhận dữ liệu nhập từ người dùng và phần khác về việc tạo đường dẫn? Hay chỉ là con đường? – Levon

+0

Chỉ cần tạo đường dẫn. – Hakim

Trả lời

9

Sẽ không ghép nối một phần đường dẫn của bạn hoàn thành những gì bạn muốn?

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

bạn có thể tạo thư mục/thư mục nếu cần.

+3

lý do tại sao tôi nhận được thông báo này: Myscript.sh: dòng 4:/home/user1/MyFolder/subFold1: Là một thư mục – Hakim

+1

Bạn đang thiếu một/từ đường dẫn. Mục tiêu là nội dòng '/ home/user1/MyFolder/subFold1' vì vậy bạn sẽ cần nội tuyến' new_path = $ base/$ subdir'. Nhưng sau đó bạn sẽ làm gì nếu đường dẫn được bao gồm dấu '/'? – Thrasi

+1

@Thrasi chỉ cần thêm dấu '/' vào biến số phụ hoặc 'newpath = $ base/$ subdir /' Bạn có thể chơi trực tiếp trên dòng lệnh – 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 

Và nếu bạn muốn sử dụng readline để bạn có được hoàn thành và tất cả những gì, thêm một -e để cuộc gọi đến read:

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

Thật không may, điều này không hoạt động khi BASEPATH trống.Những gì tôi cần là một cái gì đó như thế mà chỉ thêm một/khi nó đã không kết thúc của một dấu gạch chéo và không có sản phẩm nào. Vì vậy, khi nó kết thúc trên một tên tập tin pháp lý. –

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

Các nhiệm vụ chuẩn POSIX rằng nhiều / được đối xử dưới dạng một tên / trong tên tệp. Do đó //dir///subdir////file cũng giống như /dir/subdir/file.

Như vậy concatenating một hai chuỗi để xây dựng một con đường hoàn toàn là một đơn giản như:

full_path="$part1/$part2" 
+2

Ngoại trừ nếu $ part1 có thể là chuỗi rỗng. –

+1

@TuureLaurinolli Tôi không hiểu bạn đến từ đâu. Kết nối trên sẽ vẫn dẫn đến một đường dẫn hợp lệ. Đường dẫn có thể không tồn tại nhưng nó vẫn hợp lệ. ví dụ. '" "+"/"+" Tài liệu "' cho '"/Tài liệu "'. – Dunes

+5

Nếu chính các phần đó là đường dẫn tương đối, và part1 có thể trống, thì kết quả có thể chuyển từ tương đối so với đường dẫn tuyệt đối. –

3

Các kịch bản sau đây catenates nhiều (/ tuyệt đối tương đối) đường dẫn (BASEPATH) với một đường dẫn tương đối (subdir):

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

Kết quả trong số đó là:

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 

các shopt -s extglob chỉ cần thiết để cho phép BASEPATH kết thúc trên nhiều dấu gạch chéo (có thể là vô nghĩa). Nếu không mở rộng globing bạn chỉ có thể sử dụng:

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

đó sẽ dẫn đến việc ít gọn gàng nhưng vẫn làm việc:

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 
Các vấn đề liên quan