2017-02-09 70 views
0

請讓我知道爲什麼以下命令在csh模式下工作而不是在bash中。更改爲最新或最舊的目錄 - csh idiom不能在bash中工作

擊:

~ $ cd `ls -ltr | grep ^d | tail -1 | awk '{print $9}'` 
bash: cd: synopsys_cache_L-2016.03-SP5: No such file or directory 
~ $ pwd 
/home/mkumar 

更改爲CSH之後:依靠解析lsis innately bug-prone

~ $ csh 
CSH > cd `ls -ltr | grep ^d | tail -1 | awk '{print $9}'` 
CSH > pwd 
/home/mkumar/synopsys_cache_L-2016.03-SP5 
+2

建立依賴'ls'輸出的邏輯是一個非常糟糕的主意。 – codeforester

+0

此外,我不知道如何'cd ls -ltr | grep^d |尾-1 | awk'{print $ 9}''永遠有效。可能是你的意思是'cd $(cd ls -ltr | grep^d | tail -1 | awk'{print $ 9}')'。 – codeforester

+0

@codeforester這只是問題的格式問題。 – chepner

回答

3

代碼。不要這樣做。

下面會有點花哨,重複使用相同的代碼來構建既cd_newestcd_oldest功能:

cd_by_test() { 
    local test=$1 dir best_dir= 
    shift 
    (("$#" == 0)) && set -- */ 
    for dir; do dir=${dir%/} 
    [[ -d "$dir" ]] || continue 
    [[ $best_dir ]] || best_dir=$dir 
    [ "$dir" "$test" "$best_dir" ] && best_dir=$dir 
    done 
    if [[ $best_dir ]]; then 
    cd "$best_dir" 
    else 
    echo "No directory found" >&2 
    fi 
} 

cd_newest() { cd_by_test -nt "[email protected]"; } 
cd_oldest() { cd_by_test -ot "[email protected]"; } 

這裏,我們設置操作員使用兩個比較兩個文件,將其分配給變量$testcd_by_test函數內,然後使用[ "$dir" "$test" "$best_dir" ]來應用該運算符。


在最近修訂的版本,我們也可以目錄的特定子集之間挑:

cd_newest *-test.d/ 

...將cd到最新*-test.d目錄。

+0

謝謝你的工作:-) –

+0

只是好奇:爲什麼你從'dir'去掉尾隨的'/'? – chepner

+0

用'set -x'設置純粹的個人審美情趣;沒有什麼是令人信服的。 –

2

未經請求的插件zsh(作爲理由,我建議考慮zsh,如果你只是想移動到除csh以外的shell)。

% cd *(/om[1]) 
% pwd 
/home/mkumar/synopsys_cache_L-2016.03-SP5 

以下*括號含有各種水珠限定符

  • /限制了匹配的目錄
  • om各種膨脹通過修改時間
  • [1]僅選擇第一個匹配
+1

就像我對zsh的個人厭惡一樣,那個*很可愛。 :) –

+0

剛剛讚揚他,因爲@chepner解釋達菲的魔法! – codeforester