将子目录中无对应.out文件的.txt文件复制到tmp文件夹
筛选无对应.out的.txt文件并复制到tmp目录
这里有两种实用的方法来完成你的需求,不管是当前已知的两个子目录,还是以后扩展更多子目录都能适用:
方法一:递归处理所有子目录(通用版)
如果你的目录结构以后可能新增更多子目录,用这个递归查找的方法最省心:
# 先确保tmp目录存在,避免复制失败 mkdir -p tmp # 递归查找所有.txt文件,检查对应.out是否存在,不存在则复制 find . -type f -name "*.txt" | while read -r txt_file; do # 替换.txt后缀为.out,得到对应的输出文件路径 out_file="${txt_file%.txt}.out" # 如果.out文件不存在,就复制当前.txt到tmp if [ ! -f "$out_file" ]; then cp "$txt_file" tmp/ echo "已复制: $txt_file" fi done
代码解释:
mkdir -p tmp:-p参数确保即使tmp目录已经存在也不会报错,同时会创建嵌套的父目录(如果需要的话)find . -type f -name "*.txt":从当前目录开始,递归查找所有类型为文件、后缀是.txt的文件${txt_file%.txt}.out:这是bash的参数扩展语法,去掉文件名末尾的.txt,再加上.out,得到对应的输出文件路径[ ! -f "$out_file" ]:判断这个.out文件是否不存在,如果是就执行复制操作
方法二:针对指定子目录(高效版)
如果确定只有dir1和dir2两个子目录需要处理,用直接遍历的方式会更高效:
mkdir -p tmp # 遍历指定的子目录 for dir in dir1 dir2; do # 遍历当前目录下的所有.txt文件 for txt_file in "$dir"/*.txt; do out_file="${txt_file%.txt}.out" # 简化写法:条件满足时执行复制 [ ! -f "$out_file" ] && cp "$txt_file" tmp/ done done
注意事项:
- 两种方法都用双引号包裹了文件路径,所以即使文件名包含空格、特殊字符(比如
!、&)也能正常处理 - 如果不需要复制时的提示信息,直接去掉
echo "已复制: $txt_file"这一行即可
内容的提问来源于stack exchange,提问作者brucezepplin
相关产品推荐
相关产品推荐

