通过SSH打包最新修改目录的Tar文件时遇路径错误求助
解决SSH打包最新修改目录的路径问题
嘿,我懂你现在的烦恼——本来以为通过SSH打包最新修改的目录是件顺手的事,结果路径问题接二连三报错,确实挺闹心的。咱们来拆解问题,一步步搞定它。
先说说你遇到报错的原因
- 第一个命令用了
\ls -1dt ./*/ | head -n 1,这里的./是相对路径,如果你的SSH会话当前工作目录不是/dir1/dir2/,那系统自然找不到该目录下的最新子文件夹,所以抛出./Recent/: No such file or directory的错误。 - 改成
/*/后,你是在扫描根目录下的所有目录,而你的目标目录在/dir1/dir2/下,head -n1拿到的大概率是根目录下最新修改的某个目录(比如你提到的dir3/),这个目录根本不在你的目标路径里,cd命令当然找不到它。
靠谱的解决方案
方案一:用find命令(推荐,适配特殊目录名)
find命令比ls更稳健,能处理带空格、特殊字符的目录名,而且可以直接基于绝对路径操作,不用依赖当前工作目录:
# 第一步:获取/dir1/dir2/下最新修改的子目录的绝对路径 latest_dir=$(find /dir1/dir2/ -maxdepth 1 -type d ! -path /dir1/dir2/ -printf "%T@ %p\n" | sort -nr | head -n1 | awk '{print $2}') # 第二步:打包这个目录 tar -czf latest_directory.tar.gz "$latest_dir"
给你解释下每个参数的作用:
-maxdepth 1:只找/dir1/dir2/下的一级子目录,不递归查找-type d:只筛选目录类型的文件! -path /dir1/dir2/:排除/dir1/dir2/目录本身,只取它的子目录%T@:输出目录的修改时间戳(数字格式,方便排序),%p输出目录的绝对路径sort -nr:按时间戳从大到小排序,保证最新的目录排在最前面awk '{print $2}':提取输出结果中的路径部分,赋值给变量latest_dir
方案二:用ls命令(适合目录名无特殊字符的场景)
如果你确定目标目录的名字没有空格、&、*这类特殊字符,也可以用ls,但一定要用绝对路径指定目标范围:
# 获取/dir1/dir2/下最新的子目录 latest_dir=$(ls -1dt /dir1/dir2/*/ | head -n1) # 打包 tar -czf latest_directory.tar.gz "$latest_dir"
额外提醒
在SSH执行命令时,尽量用绝对路径,不要依赖cd到某个目录再操作——毕竟你不确定SSH会话的默认工作目录是什么,用绝对路径能避免很多不必要的路径错误。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

