Bash脚本问题:复制/etc下s开头文件并合并后删除副本
修正后的脚本及问题解析
原脚本的核心问题
- 错误1:误复制子目录内的文件:
find /etc/s* -type f会先匹配/etc下所有以s开头的文件和目录,对匹配到的目录会递归查找其中的所有文件,导致子目录内的非s开头文件也被复制。 - 错误2:内容覆盖而非追加:
$i > /root/resume每次用单个文件内容覆盖resume,最终仅保留最后一个文件的内容,且缺少删除复制文件的步骤。
方案1:使用find精准匹配文件
# 复制/etc目录下直接的、以s开头的文件到/root(排除子目录) for file in $(find /etc -maxdepth 1 -type f -name "s*"); do cp -vi "$file" /root done # 将所有复制的文件内容合并到resume cat /root/s* > /root/resume # 删除/root下复制来的s开头文件(不影响resume) rm -v /root/s*
方案2:用通配符+文件判断(更简洁)
# 遍历/etc下以s开头的条目,仅处理文件 for file in /etc/s*; do [ -f "$file" ] || continue # 跳过目录,只处理文件 cp -vi "$file" /root done # 合并内容到resume cat /root/s* > /root/resume # 删除复制的文件 rm -v /root/s*
关键说明
-maxdepth 1(方案1):限制find仅查找/etc目录本身,不递归子目录。[ -f "$file" ](方案2):判断当前条目是否为文件,跳过目录。cat /root/s* > /root/resume:一次性合并所有目标文件内容,比循环追加更高效。rm -v /root/s*:仅删除/root下以s开头的文件,resume文件名不符合,不会被误删。
内容的提问来源于stack exchange,提问作者agm_2502
相关产品推荐
相关产品推荐

