2015-06-02 25 views
1

我傾向於在工作日期間訪問相同的目錄。在新的終端和PUSHD使用迪爾斯-v命令我可以保持一個列表文件中的展開〜在Bash

迪爾斯-v>最後lines.txt

我希望能夠重新讀取該文件線上的每個目錄。我有什麼是

cat ~/last-list.txt | while read line; do pushd $line; done 

我遇到的問題是,「〜」不擴大,其結果是PUSHD失敗

-bash: pushd: ~/director-name: No such file or directory 

反正是有力量「〜」是擴展到完整的路徑,還是更聰明的方式來完成上述?

感謝

+1

注意你可以說'while read -r line;推動...;完成<〜/ last-list.txt而不是'cat |而...'。 – fedorqui

+1

我最近完成的答案是http://stackoverflow.com/a/18742860/14122。也就是說,更簡單的答案並不是支持數據文件中的波浪擴展 - 這在非交互式應用中不是一個常見的功能。 –

+1

順便說一句 - 目錄名稱可以有文字換行符。然後,從換行符分隔的文件中讀取它們並不是一個很好的做法。 (另外,它們可以以空格結尾,所以在讀取過程中需要清除'IFS',並且它們可以包含文字反斜槓,所以如果你需要將'-r'傳遞給讀命令想要涵蓋所有的角落案例)。 –

回答

1

更改pushd $line;到:

pushd "${line/#\~/$HOME}"; 

~將擴大到$HOME

注意:使用雙引號來處理空格路徑

您正在沒用使用的cat。這裏根本不需要。

從文件中讀取行:

while IFS= read -r line;do 
#do something 
done < filepath 

從一個完整的,但更復雜的解決方案Charles Duffys' answer to this question

expandPath() { 
    local path 
    local -a pathElements resultPathElements 
    IFS=':' read -r -a pathElements <<<"$1" 
    : "${pathElements[@]}" 
    for path in "${pathElements[@]}"; do 
    : "$path" 
    case $path in 
     "~+"/*) 
     path=$PWD/${path#"~+/"} 
     ;; 
     "~-"/*) 
     path=$OLDPWD/${path#"~-/"} 
     ;; 
     "~"/*) 
     path=$HOME/${path#"~/"} 
     ;; 
     "~"*) 
     username=${path%%/*} 
     username=${username#"~"} 
     IFS=: read _ _ _ _ _ homedir _ < <(getent passwd "$username") 
     if [[ $path = */* ]]; then 
      path=${homedir}/${path#*/} 
     else 
      path=$homedir 
     fi 
     ;; 
    esac 
    resultPathElements+=("$path") 
    done 
    local result 
    printf -v result '%s:' "${resultPathElements[@]}" 
    printf '%s\n' "${result%:}" 
} 

用法:

pushd "$(expandPath "$line")" 

"$(expandPath "$line")"是擴張路徑

+0

這適用於簡單情況。不適用於'〜用戶名'或許多其他角落。有一個答案在這裏被複制和粘貼,試圖覆蓋所有的答案;尋找它。 –

+0

非常感謝! –

+0

@CharlesDuffy我可以在這裏添加你的解決方案,這是一個相當傳奇的解決方案,你到達那裏...... – Jahid