Shell脚本中如何向随机生成的目录路径复制文件?
解决Shell脚本中适配随机生成目录的文件复制问题
问题描述
需要将文件复制到家目录下类似/home/myproject/Gs54hs6h/images/的路径中,但路径中间的Gs54hs6h目录会在每次运行新进程时自动生成新的随机名称,如何在Shell脚本中适配这种随机目录?例如执行cp xyz.img /home/mydotproj/xxxxxxxxx/images/时该怎么处理?
解决方案
根据不同场景,有以下几种实用写法:
1. 通配符直接匹配(适用于目录唯一的场景)
如果/home/myproject/下每次只会存在一个随机命名的子目录,直接用*通配符匹配该目录:
cp xyz.img /home/myproject/*/images/
如果随机目录有固定的命名规则(比如8位字母数字组合),可以用更精确的通配符缩小范围(需要bash开启extglob扩展,可通过shopt -s extglob开启):
shopt -s extglob cp xyz.img /home/myproject/[a-zA-Z0-9]{8}/images/
注意:如果目录下存在多个符合条件的子目录,这个方法会报错,仅适合单目录场景。
2. 用find定位最新生成的目录(适用于多目录但需取最新的场景)
如果/home/myproject/下可能存在多个随机目录,但每次新生成的是最新的那个,用find结合排序取最新目录:
# 定位最新的随机子目录 TARGET_DIR=$(find /home/myproject -maxdepth 1 -type d -name "[a-zA-Z0-9]*" ! -name "myproject" | sort -r | head -n 1)/images/ # 执行复制 cp xyz.img "$TARGET_DIR"
解释:
-maxdepth 1限制只查找一级子目录,避免递归到更深层级-type d指定只找目录-name "[a-zA-Z0-9]*"匹配字母数字组成的目录名! -name "myproject"排除目录本身sort -r按名称倒序排序(如果目录名包含时间戳或递增字符,也可改用-printf "%T@ %p\n"按修改时间排序)head -n 1取第一个即最新的目录
如果要按修改时间精准取最新目录,可修改find命令:
TARGET_DIR=$(find /home/myproject -maxdepth 1 -type d -name "[a-zA-Z0-9]*" ! -name "myproject" -printf "%T@ %p\n" | sort -n -r | head -n 1 | awk '{print $2}')/images/
3. 捕获生成目录进程的输出(最可靠的场景)
如果生成随机目录的进程会输出该目录的路径或名称,直接捕获这个输出是最稳妥的方式,避免匹配错误:
# 假设生成目录的脚本/命令会输出随机目录名 RANDOM_DIR=$(./generate_random_directory.sh) # 拼接完整路径并复制 cp xyz.img "/home/myproject/$RANDOM_DIR/images/"
这种方法完全依赖生成进程的输出,准确性最高。
内容的提问来源于stack exchange,提问作者Pj1947
相关产品推荐
相关产品推荐

