更改为最新或最旧的目录 - csh idiom不能在bash中工作
请让我知道为什么以下命令在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之后:依靠解析ls
is 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
代码。不要这样做。
下面会有点花哨,重复使用相同的代码来构建既cd_newest
和cd_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]"; }
这里,我们设置操作员使用两个比较两个文件,将其分配给变量$test
在cd_by_test
函数内,然后使用[ "$dir" "$test" "$best_dir" ]
来应用该运算符。
在最近修订的版本,我们也可以目录的特定子集之间挑:
cd_newest *-test.d/
...将cd
到最新*-test.d
目录。
未经请求的插件zsh
(作为理由,我建议考虑zsh
,如果你只是想移动到除csh
以外的shell)。
% cd *(/om[1])
% pwd
/home/mkumar/synopsys_cache_L-2016.03-SP5
以下*
括号含有各种水珠限定符:
-
/
限制了匹配的目录 -
om
各种膨胀通过修改时间 -
[1]
仅选择第一个匹配
就像我对zsh的个人厌恶一样,那个*很可爱。 :) –
刚刚赞扬他,因为@chepner解释达菲的魔法! – codeforester
建立依赖'ls'输出的逻辑是一个非常糟糕的主意。 – codeforester
此外,我不知道如何'cd ls -ltr | grep^d |尾-1 | awk'{print $ 9}''永远有效。可能是你的意思是'cd $(cd ls -ltr | grep^d | tail -1 | awk'{print $ 9}')'。 – codeforester
@codeforester这只是问题的格式问题。 – chepner