我有一个问题,我想将 ls 和 cd 连接在一起。我创建了如下 shell 管道:
cesta = ls -lat | awk 'NR==2 {print $8"/"}'
cd $cesta
但它不起作用。你能帮我吗?而且我没有收到任何错误。Filip
答案1
您所尝试的操作存在一些问题。首先,要设置变量的值,在 周围不能有空格=
。然后,为了捕获命令的输出,您需要使用反引号,或者最好是$()
。
最后,也是最重要的,你不应该解析ls
,这很难做好,而且极易出错。例如,如果您的目录名称包含空格,您的方法就会失败。在下面的示例中,字段是什么8th
?
$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Nov 11 14:59 file1
-rw-r--r-- 1 terdon terdon 0 Nov 11 2013 file2
-rw-r--r-- 1 terdon terdon 0 Nov 11 15:00 file 2
-----
|--------> 8th field
文件/目录名称可能是第 9 个字段,也可能是第 9 个和第 10 个字段,甚至更多。另外,日期格式可能会因语言环境而异。基本上,使用ls
这个是个糟糕的主意。相反,使用stat
并按时间排序:
$ cesta=$(stat --printf "%X\t%n\n" * | sort -nk1,1 | cut -f 2- | awk 'NR==2')
$ cd "$cesta"
答案2
你的命令输出什么?
ls -lat | awk 'NR==2 {print $8"/"}'
就我而言,我知道目录的创建时间。
使用命令替换它对我有用:
$ ABCD=`ls -lat | awk 'NR==2 {print $9"/"}'`
$ cd $ABCD
$ pwd
$ /home/myuser_name/.gconfd
干杯,雨果。