更改为最新或最旧的目录 - csh成语在bash

时间:2017-02-09 22:17:52

标签: bash shell

请让我知道为什么以下命令在csh模式下工作,而不是在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后

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

2 个答案:

答案 0 :(得分:3)

依赖于解析ls is innately bug-prone的代码。不要这样做。

以下内容有点花哨,重复使用相同的代码来构建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 "$@"; }
cd_oldest() { cd_by_test -ot "$@"; }

在这里,我们将运算符设置为使用两个比较两个文件,方法是将其分配给$test函数中的变量cd_by_test,然后使用[ "$dir" "$test" "$best_dir" ]应用该运算符。

在最近修订的版本中,我们还可以在特定目录子集之间进行选择:

cd_newest *-test.d/

...将cd发送到最新的*-test.d目录。

答案 1 :(得分:2)

zsh的未经请求的插件(作为理由,如果您只想移动到zsh以外的其他shell,我建议考虑csh

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

*后面的括号包含各种glob 限定符

  • /将匹配限制为目录
  • om按修改时间对扩展进行排序
  • [1]仅选择第一场比赛