2017-02-09 26 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