liunx口令如何替换某个文件夹下的所有子文件夹的文件,而其他文件不受影响?

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

liunx口令如何替换某个文件夹下的所有子文件夹的文件,而其他文件不受影响?

一、如果你的目的是「替换(覆盖)」子文件夹里的文件

比如你有:

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 -frsync -a

分享

你的反应是什么?

喜欢 喜欢 0
不喜欢 不喜欢 0
爱 0
有趣的 有趣的 0
生气的 生气的 0
伤心 伤心 0
哇 0