Saya mencoba menulis skrip bash. Dalam skrip ini saya ingin pengguna memasukkan jalur direktori. Lalu saya ingin menambahkan beberapa string di akhir string ini dan membangun jalur ke beberapa subdirektori. Misalnya asumsikan pengguna memasukkan string seperti ini:
/home/user1/MyFolder
Sekarang saya ingin membuat 2 subdirektori di direktori ini dan menyalin beberapa file di sana.
/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2
Bagaimana saya bisa melakukan ini?
Jawaban:
Standar POSIX mengamanatkan bahwa beberapa
/
diperlakukan sebagai satu/
dalam satu nama file. Jadi//dir///subdir////file
sama dengan/dir/subdir/file
.Karena itu, menggabungkan dua string untuk membangun jalur yang lengkap semudah:
full_path="$part1/$part2"
sumber
"" + "/" + "Documents"
memberi"/Documents"
../
ke depan. Tapi mungkin pengguna ingin menggabungkan jalur absolut. Jika tidak, mereka bisa menambahkan./
ke depan untuk memaksa jalan menjadi relatif. Perhatikan juga bahwa"$path1/./$path2"
sama dengan"$path1/$path2"
.#!/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
Dan jika Anda ingin menggunakan readline sehingga Anda mendapatkan penyelesaian dan semua itu, tambahkan a
-e
ke panggilan keread
:read -e -p "Enter a directory: " BASEPATH
sumber
Tidakkah hanya menggabungkan bagian dari jalan Anda mencapai apa yang Anda inginkan?
$ base="/home/user1/MyFolder/" $ subdir="subFold1" $ new_path=$base$subdir $ echo $new_path /home/user1/MyFolder/subFold1
Anda kemudian dapat membuat folder / direktori sesuai kebutuhan.
Salah satu konvensi adalah mengakhiri jalur direktori dengan
/
(misalnya/home/
) karena jalur yang dimulai dengan / bisa disalahartikan dengan direktori root. Jika garis miring ganda (//
) digunakan di sebuah jalur, itu juga masih benar. Tapi, jika tidak ada garis miring yang digunakan pada salah satu variabel, itu akan menjadi salah (misalnya/home/user1/MyFoldersubFold1
).sumber
/home/user1/MyFolder/subFold1
agar Anda perlu sebarisnew_path=$base/$subdir
. Tapi lalu apa yang Anda lakukan jika jalur yang diberikan menyertakan tanda '/'?newpath=$base/$subdir/
Anda dapat memainkannya langsung di baris perintahSkrip berikut mengkatenisasi beberapa jalur (relatif / absolut) (BASEPATH) dengan jalur relatif (SUBDIR):
shopt -s extglob SUBDIR="subdir" for BASEPATH in '' / base base/ base// /base /base/ /base//; do echo "BASEPATH = \"$BASEPATH\" --> ${BASEPATH%%+(/)}${BASEPATH:+/}$SUBDIR" done
Outputnya adalah:
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
Ini
shopt -s extglob
hanya diperlukan untuk mengizinkan BASEPATH diakhiri pada beberapa garis miring (yang mungkin tidak masuk akal). Tanpa perluasan global, Anda dapat menggunakan:echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR
yang akan mengakibatkan kurang rapi tetapi tetap berfungsi:
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
sumber
Saya sedang mengerjakan skrip shell saya yang perlu melakukan beberapa jalur bergabung dengan hal-hal seperti yang Anda lakukan.
Masalahnya, kedua jalur seperti itu
valid.
Jika saya ingin menambahkan file ke jalur ini seperti
tidak ada metode asli (seperti os.path.join () di python) di shell untuk menangani situasi seperti itu.
Tapi aku menemukan tipuan
Misalnya, jalur dasar disimpan dalam variabel shell
dan nama file terakhir yang ingin Anda bergabung adalah
Kemudian Anda dapat menetapkan jalur baru Anda seperti ini
NEW_PATH=$(realpath ${BASE})/FILE
dan kemudian Anda akan mendapatkannya
$ echo $NEW_PATH /path/to/your/home/mydir/myfile
alasannya cukup sederhana, perintah "realpath" akan selalu memangkas garis miring untuk Anda jika perlu
sumber
#!/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 "$@"
sumber
Ini seharusnya berfungsi untuk dir kosong (Anda mungkin perlu memeriksa apakah string kedua dimulai dengan
/
yang harus diperlakukan sebagai jalur absolut?):#!/bin/bash join_path() { echo "${1:+$1/}$2" | sed 's#//#/#g' } join_path "" a.bin join_path "/data" a.bin join_path "/data/" a.bin
Keluaran:
Referensi: Ekspansi Parameter Shell
sumber