Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何将cd放入排序后的第一个目录_Bash_Shell_Unix_Ls_Cd - Fatal编程技术网

Bash 如何将cd放入排序后的第一个目录

Bash 如何将cd放入排序后的第一个目录,bash,shell,unix,ls,cd,Bash,Shell,Unix,Ls,Cd,我有一个文件夹,里面有目录 ABC_1 ABC_2 ABC_3 ABC_4 ABC_5 Test XYZ 我想按日期对它们进行排序,将名称中不包含ABC和cd的目录删除到第一个目录中 我试过了 cd $(/bin/ls -t1 | head -n 1) 这是行不通的。 任何帮助都将不胜感激 谢谢。这将只列出目录,并过滤掉任何不以ABC开头的文件夹: cd "$(ls -t1 -d */ |grep "^ABC_" |head -n1)" 更新: 你其实不需要grep 海报需要列表后的第一

我有一个文件夹,里面有目录

ABC_1
ABC_2
ABC_3
ABC_4
ABC_5
Test
XYZ
我想按日期对它们进行排序,将名称中不包含ABC和cd的目录删除到第一个目录中

我试过了

cd $(/bin/ls -t1 | head -n 1)
这是行不通的。 任何帮助都将不胜感激

谢谢。

这将只列出目录,并过滤掉任何不以ABC开头的文件夹:

cd "$(ls -t1 -d */ |grep  "^ABC_" |head -n1)"
更新:

你其实不需要grep


海报需要列表后的第一个结果,而不是根据修改时间的第一个结果,因此不需要“-t”选项

您还必须确保只提取目录而不是文件

这将满足您的要求:

cd $(ls -d [^ABC]*/ | head -n 1)
  • $()运行命令
  • ls-d目录搜索
  • [^ABC]/不要包含任何以ABC开头的目录
  • head-n1返回第一个条目
  • cd更改到目录

“不工作”怎么说?你应该解释一下当前的行为是什么…我得到一个错误的目录名:nota directory这个命令没有显示我的ABC目录,也没有显示其他目录directories@MohitArora:对不起,我本来应该有
grep
的,因为我误读了你的问题,所以我有
grep-v
。我现在修好了。那么
/bin/ls/*ABC*
呢?(我也会从问题中假设
grep-v
。@fedorqui:ls*解决方案的问题是,如果存在大量匹配项,它们将失败,因为命令行将变得太长。所以我不会这样做,除非我确定匹配的数量很少。好吧,这是很少见的,但是是的,一般来说:)
ls
可能有点风险(请参阅)。是否可以选择使用Zsh而不是Bash?使用Zsh时,命令将是
cd*(D[1])
D
只选择目录,通配符(*)按字母顺序对它们进行排序,
[1]
取第一个。@user1934428我知道这些陷阱,通常我会首先避免从脚本进入目录。我可能会结合使用
find
stat
sort
。然而,OP并没有具体说明他的最终目标是什么,这使得很难猜测更好的解决方案。此外,输出必须根据修改时间(
ls-t
)而不是字母顺序进行排序。如果需要根据修改时间将chdir转换为最新的,可以使用zsh使用
setopt extendedglob
然后使用
cd*(#q/om[-1])
。请参阅zsh手册页中标题为Glob限定符的部分。(为了完整起见:我刚刚注意到我在上一篇评论中犯了一个键入错误。要按字母顺序获取第一个,正确的模式应该是
*(/[1])
,而不是
*(D[1]))
/
选择目录,而
D
只会打开文件/目录的匹配,其中名称以句点开头。
cd "$(ls -t1 -d ABC_*/ | head -n1)"
cd $(ls -d [^ABC]*/ | head -n 1)