基于文本文件内容复制指定目录与文件:保留目录结构求助
解决保留目录结构复制文件的问题
没问题,我来帮你搞定这个保留目录结构的复制需求!你当前的命令之所以只复制了文件、没保留目录结构,是因为mv(如果是复制操作更推荐用cp)本身不会自动创建目标路径的父目录,xargs只是把所有文件一股脑丢到try文件夹里,完全忽略了原有的路径层级。
方案一:用rsync(最简便推荐)
rsync是处理文件同步、复制的利器,能自动帮你创建所需的目录结构,命令也很简洁:
# 先创建目标文件夹(rsync也能自动创建,但提前建更稳妥) mkdir -p /c/Users/name/Downloads/try/ # 去掉文件路径前的*,然后用rsync按列表复制并保留结构 sed 's/^\*//' difference.txt | rsync -av --files-from=- . /c/Users/name/Downloads/try/
命令解释:
sed 's/^\*//' difference.txt:把difference.txt里每行开头的*去掉,得到干净的文件路径。rsync -av --files-from=- . /c/Users/name/Downloads/try/:-a:归档模式,会保留文件的权限、目录结构等属性。-v:verbose模式,显示复制过程的详细信息(可选,方便排查问题)。--files-from=-:告诉rsync从标准输入(也就是前面sed输出的内容)读取要复制的文件列表。.:表示源文件的基准目录(要确保这个目录是Time文件夹的上级目录)。- 最后是目标文件夹路径。
方案二:用循环+mkdir -p(通用兼容所有环境)
如果你的环境里没有rsync,可以用shell循环逐行处理文件路径,先创建目标目录再复制文件:
# 创建根目标文件夹 mkdir -p /c/Users/name/Downloads/try/ # 读取处理后的文件路径列表,逐行处理 sed 's/^\*//' difference.txt | while read -r file_path; do # 提取文件所在的目录路径 dest_dir="/c/Users/name/Downloads/try/$(dirname "$file_path")" # 创建目标目录(-p参数会自动创建所有不存在的父目录) mkdir -p "$dest_dir" # 复制文件到目标目录 cp "$file_path" "$dest_dir/" done
命令解释:
read -r file_path:安全读取每一行的文件路径,-r防止转义字符被错误解析(比如路径里有空格或特殊字符时很重要)。dirname "$file_path":提取文件所在的目录(比如Time/Inspire/config/dashboards/non.json会被提取为Time/Inspire/config/dashboards)。mkdir -p "$dest_dir":-p参数确保所有层级的父目录都会被创建,即使它们之前不存在。
如果你的需求是移动文件而不是复制,把上面的cp换成mv就可以了。
内容的提问来源于stack exchange,提问作者X00145570
相关产品推荐
相关产品推荐

