使用find命令按条件查找多个文件并且拷贝至指定目录

本文介绍了一种在Linux环境下使用find命令结合xargs进行文件查找与批量拷贝的方法,特别适用于处理多个条件下的文件搜索,如同时查找.war和.jar文件,并将它们拷贝到指定目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  命令格式如下

find /  \( -name "*.war" -o -name "*.jar" \) | xargs -i cp {} ${wardir}

  当需要查找多个条件时候使用()然后加两个-name ()需要使用转义符号\

  xargs -i cp {} ${wardir}重定向把查找出来的文件拷贝至指定文件夹

 

转载于:https://www.cnblogs.com/minseo/p/9067944.html

<think>嗯,用户想知道如何用SCP命令根据修改时间筛选传输某个目录中在指定日期之后修改的文件。首先,我记得SCP本身不支持按时间筛选文件,所以需要结合其他命令。常用的方法可能是用find来找到符合条件的文件,然后通过-exec或管道传递给SCP。 之前看到过引用[1]里的例子,用find命令配合-newermt选项来查找特定时间范围内的文件,然后用-exec执行scp。比如,用户需要复制修改时间晚于某个日期的文件,可以用find的-newermt参数。比如,查找比2023-01-01更新的文件命令应该是find . -type f -newermt '2023-01-01',然后通过-exec scp到目标主机。 不过,用户的问题是要传输“指定日期之后”的文件,也就是修改时间晚于那个日期的所有文件。这时候,find命令的正确参数应该是-newermt,后面跟上日期。例如,find /path/to/dir -type f -newermt '2024-01-01',这样会找到所有在2024年1月1日之后修改的文件。 然后,如何将这些文件用SCP传输呢?可以用-exec参数,每找到一个文件就执行scp。例如,-exec scp {} user@remote:/path \;。不过,这样每次找到一个文件就执行一次scp,可能会多次输入密码,效率不高。如果使用SSH密钥认证,可以避免这个问题。 另外,引用[3]提到,SCP可以直接从一台主机复制到另一台,但这里的情况可能是在本地主机执行,将文件传到远程。所以命令结构应该是find ... -exec scp {} 远程用户@IP:目标目录 \;。 需要注意的是,路径中的空格或其他特殊字符可能需要处理,可以使用引号包裹{},或者考虑使用xargs。比如,引用[4]中的例子用了xargs来传递参数,但xargs和-exec的区别在于如何处理参数。xargs可以将多个文件一次性传递给scp,而-exec每次处理一个文件,可能会更安全,但速度可能稍慢。 所以,最终的组合命令应该是:find [目录路径] -type f -newermt [日期] -exec scp {} user@host:目标路径 \;。例如,要复制/home/user/docs下修改时间在2024-01-01之后的文件到远程主机的/backup目录命令就是: find /home/user/docs -type f -newermt '2024-01-01' -exec scp {} user@remotehost:/backup \; 如果目标路径需要保持目录结构,可能需要额外处理,比如使用rsync而不是scp,但用户明确要求用SCP。因此,可能需要确保目标路径存在,或者在find命令使用相对路径,配合--parents选项,但find的-exec中使用scp可能无法保留目录结构。这时候用户可能需要考虑其他方法,但根据问题描述,直接传输文件到目标目录即可。 另外,测试命令是否正确可以先使用ls替代scp,确认找到的文件是否正确,比如: find /home/user/docs -type f -newermt '2024-01-01' -exec ls -l {} \; 确认无误后再替换成scp命令执行实际传输。 总结步骤:使用find查找指定日期后的文件,用-exec执行scp逐个传输。确保权限正确,可能需要密钥认证避免多次输入密码。</think>### 分步解决方案 1. **使用`find`命令筛选文件** 通过`-newermt`参数指定修改时间的下限,格式为`YYYY-MM-DD`。例如,筛选修改时间晚于`2023-05-01`的文件: ```bash find /path/to/source_dir -type f -newermt '2023-05-01' ``` 此命令会列出`source_dir`目录下所有在2023年5月1日之后修改过的文件[^2]。 2. **结合`-exec`参数执行SCP传输** 将筛选结果通过`-exec`直接传递给`scp`命令,实现文件传输: ```bash find /path/to/source_dir -type f -newermt '2023-05-01' -exec scp {} user@remote_host:/path/to/destination_dir \; ``` 其中: - `{}`表示`find`查找到的文件路径占位符 - `\;`表示`-exec`参数结束符 此操作会逐个传输符合条件的文件到远程主机的目标目录[^1][^3]。 3. **优化传输效率(可选)** - **使用`xargs`批量传输**:减少`scp`调用次数,提高效率: ```bash find /path/to/source_dir -type f -newermt '2023-05-01' -print0 | xargs -0 -I {} scp {} user@remote_host:/path/to/destination_dir ``` `-print0`和`-0`用于处理文件名中的空格或特殊字符[^4]。 - **配置SSH密钥认证**:避免多次输入密码,参考命令: ```bash ssh-keygen -t rsa # 生成密钥对 ssh-copy-id user@remote_host # 将公钥复制到远程主机 ``` --- ### 完整示例 传输`/var/log`目录下所有在2023-06-01之后修改的日志文件到远程主机`192.168.1.100`的`/backup/logs`目录: ```bash find /var/log -type f -newermt '2023-06-01' -exec scp {} admin@192.168.1.100:/backup/logs \; ``` --- ### 注意事项 - **时间格式精确到分钟**:若需更精确时间范围,可使用`-newermt "2023-05-01 14:30"` - **排除符号链接**:`-type f`确保仅传输普通文件,避免处理符号链接 - **目标目录权限**:确保远程主机的目标目录有写入权限。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值