2017-04-15 42 views
0

給定一個可以存在或不存在的文件路徑,如何在bash腳本中創建文件夾結構和文件?如何爲給定路徑創建文件夾結構和文件

實例運行我的腳本(腳本的名稱和文件路徑爲放慢參數傳遞):

./someTask.sh /folder/structure/file.html 

我已經試過的mkdir但它創建一個名爲file.html過的文件夾。任何幫助將非常感激。

+1

將使用mkdir只有在目錄結構,而不是文件名通過?然後只需觸摸文件。 – 123

+1

您也可以使用install命令'install -Dm644/dev/null/folder/structure/file.html' – 123

回答

2

只是做了(不洙花哨),但簡單:

crfile() { 
    dir=$(dirname "$1") 
    mkdir -p "$dir" && touch "$1" 
} 

while read -r path; do 
    crfile "$path" 
done << EOF 
some.txt 
./some.txt 
../some.txt 
.././some.txt 
../other/some.txt 
/some.txt 
/sub/some.txt 
/sub/../etc/some.txt 
EOF 

,或者如果你需要從man mkdir縮短

crfile() { mkdir -p "$(dirname "$1")" && touch "$1"; } 

-p創建中間目錄,需要。如果未指定此選項 ,則每個操作數的完整路徑前綴 必須已經存在。另一方面,如果指定了這個選項,如果作爲操作數給出的目錄已經存在,則報告 沒有錯誤。中間目錄通過當前umask修改的rwxrwxrwx(0777)的 權限位以及所有者的寫入和搜索權限 創建。

使用dirname比使用參數替換嘗試修改路徑要好得多。閱讀更多Bash variable substitution vs dirname and basename

是的,如果你願意,可以添加-- - 如果你期望文件或目錄以-開頭,這是很好的...

2

這是一個仍然非常短的解決方案,但不應導致根目錄中的相關文件或文件出現問題。

crfile() 
{ 
    [[ ! -e $1 ]] && mkdir -p -- "$1" && rmdir -- "$1" && touch -- "$1" 
} 

說明:

  • 如果現有的(任何類型)的文件,不要繼續。
  • 創建一個目錄第一,與-p選項來創建整個結構
  • 如果目錄的創建沒有成功,不要繼續
  • 如果目錄創建成功,然後刪除剛剛創建的目錄(這將是空),如果因爲任何原因刪除失敗,則不要繼續。
  • 如果一切成功,請觸摸路徑以創建文件。

通過首先創建所需的目標作爲目錄,然後將其刪除並創建爲文件,父目錄路徑(永不提取)或相對路徑不再有特殊情況。

+1

是的,這是最簡單的解決方案,如果不想使用'dirname'也不會在特殊情況下發瘋'$ {1%/ *}'。注意一下真正的偏執狂:如果你希望這個函數能夠工作,即使路徑名以短劃線開始,在'「$ 1」之前加一個'--'到'mkdir','rmdir'和'touch'' 。 – Dario

+0

@Dario很好的建議,我修改了答案。 – Fred

+0

謝謝@Fred,解決方案完美運作。爲了簡單起見,我使用dirname。讓我知道如果我的選擇有其他缺點。 – popcoder

0

提供替換DIRNAME你也可以使用參數替換:

mkdir -p "${1%/*}" && touch "$1" 
+2

_Mostly_將起作用。 :)和'/ some.txt'? :)或簡單的'some.txt'(沒有任何目錄?) – jm666

+0

@ jm666 - 公平點:) – grail

相關問題