liunx口令如何替换某个文件夹下的所有子文件夹的文件,而其他文件不受影响?
本文详细讲解在 Linux 系统中,如何使用命令行仅替换某个文件夹下所有子文件夹中的文件,而不影响主目录下的其他文件。适用于批量文件替换、系统维护及自动化运维场景

一、如果你的目的是「替换(覆盖)」子文件夹里的文件
比如你有:
A/
├── file1.txt
├── file2.txt
├── sub1/
│ ├── x.txt
│ └── y.txt
└── sub2/
└── z.txt
你想用 /tmp/newfiles/
下的同名文件去替换 A 下所有 子目录里的文件(但不动 A 根目录下的文件)。
可用:
find A -mindepth 2 -type f -exec cp -f /tmp/newfiles/$(basename {}) {} \;
解释:
-
-mindepth 2
:表示忽略 A 自身层级,只作用于子目录; -
-type f
:只处理文件; -
cp -f
:强制覆盖; -
$(basename {})
:取文件名匹配。
注意:这样只有当 /tmp/newfiles/
里有同名文件时才会被替换,否则报错(可加 2>/dev/null
忽略)。
二、如果你只是要“替换内容(比如字符串)”
比如想把所有子文件夹下 .php
文件中的 “旧字符串” 替换为 “新字符串”,但不动 A 根目录的文件。
find A -mindepth 2 -type f -name "*.php" -exec sed -i 's/旧字符串/新字符串/g' {} +
解释:
-
仍然用
-mindepth 2
来忽略最顶层; -
sed -i
直接修改原文件内容; -
{}
表示当前文件; -
+
表示批量执行 sed。
三、如果你只是想「复制替换」整个目录层结构
比如 /tmp/newfiles
有同名子目录结构:
rsync -av --exclude '*/' /tmp/newfiles/ A/
但你想排除 A 根目录的文件,只更新子目录:
find A -mindepth 1 -type d -exec rsync -av /tmp/newfiles/ {} \;
四、例子总结
目标 | 命令 |
---|---|
仅对子目录的文件执行操作 | find A -mindepth 2 -type f ... |
不动根目录文件 | 使用 -mindepth 2 |
查找所有子目录 | find A -mindepth 1 -type d |
内容替换 | sed -i 's/old/new/g' |
覆盖同名文件 | cp -f 或 rsync -a |
分享
你的反应是什么?






