递归比较目录的 Shell 脚本

2024-04-22

我在外部硬盘驱动器上有一个几个月前的文件服务器备份,用于从那时起就出现故障的文件服务器。大部分数据已恢复到此后一直使用的临时文件服务器上,但存在一些不一致之处。

我将安装外部并将其与当前数据同步,但首先我需要建立已在较新副本上更新的文件。

我可以做 diff -r -q /old/ /new/ 来获得这个,我试图更好地编写脚本,所以我试图编写一些东西,每当 diff 返回差异时,将旧文件重命名为 filename.old 。


所以检查后,我找不到选项diff仅输出文件名差异,因此我们只需使用 diff 输出的内容即可。

If diff找到不同的文件,输出如下:

Files old/file and new/file differ

由于 bash 脚本要做的就是重命名旧目录中已更改的文件,因此我们要提取old/file从这个输出。让我们从只显示像这样的行开始Files...differ(可能会生产其他生产线):

diff -rq old/ new/ | grep "^Files.*differ$"

现在你只会得到像前面显示的那样的线条。下一步是获取文件名。你可以这样做awk通过添加类似的东西awk '{print $2}'作为另一个管道,但如果文件名本身包含空格,awk 会将其分解为两个单独的字符串。我们将使用 sed 来代替:

diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'

现在这将生成旧目录中已更改的文件列表。使用简单的 for 循环,您现在可以重命名每个文件:

for old_file in `diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'`
do
   mv $old_file $old_file.old
done

就是这样!

编辑:实际上,这还不是全部。这个循环在带有空格的文件上仍然失败,所以让我们稍微处理一下。for默认情况下将尝试生成一个以空格分隔的列表。让我们将其更改为使用换行符:

OLD_IFS=$IFS
# The extra space after is crucial
IFS=\

for old_file in `diff -rq old/ new/ | grep "^Files.*differ$" | sed 's/^Files \(.*\) and .* differ$/\1/'`
do
   mv $old_file $old_file.old
done
IFS=$OLD_IFS

这暂时取代了 bash 的默认分隔符($IFS) 到换行符,并在循环完成后将其放回原处,这样就不会被空格分割。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归比较目录的 Shell 脚本 的相关文章

  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • 子 shell 何时继承其父 shell 环境?

    什么情况下将shell的环境传递给子shell 子 shell 始终从父 shell 获取所有变量 man bash将描述所有使用子shell的情况 主要是 command command command and command 所谓环境只
  • 访问 bash 命令行参数 $@ 与 $*

    在许多 SO 问题和 bash 教程中 我发现可以通过两种方式访问 bash 脚本中的命令行参数 gt cat testargs sh bin bash echo you passed me echo you passed me 结果是 g
  • ANSI 转义码在行尾有奇怪的行为

    重现步骤 考虑以下 shell 命令 echo e e 41mTest nTest2 e 0mTest3 它打印Test并在下一行中Test2具有红色背景 使用 ANSI 转义码 Test2后面直接是Test3这是无色的 行为 第一次执行此
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 将终端颜色扩展到行尾

    我有一个生成 motd 的 bash 脚本 问题取决于某些终端设置 我不确定颜色是否会延伸到行尾 其他时候则不然 e g v s IIRC 一个只是普通的 gnome 终端 另一个是我的 tmux 术语 所以我的问题是如何才能将其扩展到 8
  • 忽略提交之间 git-diff 的*所有*空白更改

    我正在检查代码库并修复空白奇怪之处并通常纠正缩进等事情 并且我想确保我没有无意中进行任何其他更改 所以我正在做git diff w显示所有已更改文件中的差异 同时忽略空白差异 问题是这实际上并没有忽略all空白差异 至少是什么I认为仅仅是空
  • 向伪 shell (pty) 发出命令

    我尝试使用 subprocess popen os spawn 来运行进程 但似乎需要伪终端 import pty master slave pty openpty os write master ls l 应该发送 ls l 到从属终端
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • 如何从 powershell 中设置 bash 的环境变量?

    使用powershell我该如何设置 https askubuntu com q 1205227 45156 the 环境 https stackoverflow com q 5327495 262852变量 这里 特别 https sta
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • execlp 多个“程序”

    我想运行类似的东西 cat file tar base64 myprogram c base64 d tar zvt I use execlp运行该进程 当我尝试运行类似的东西时cat它有效 但如果我尝试运行base64 d tar zvt
  • 命令运行时从 shell_exec 命令获取输出

    我正在编写一个 PHP 脚本网页 该网页旨在接受先前上传到服务器的 JFFS2 图像的文件名 然后 该脚本将使用映像重新刷新服务器上的分区 并输出结果 我一直在用这个 tmp shell exec update flash v filena
  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • Bash 脚本:#!/bin/bash 是什么意思? [复制]

    这个问题在这里已经有答案了 在 bash 脚本中 什么是 bin bash第一行是什么意思 UPDATE 有区别吗 bin bash and bin sh 这就是所谓的shebang http en wikipedia org wiki S
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 在 shell 脚本中连接命令字符串

    我正在维护一个现有的 shell 脚本 它将命令分配给 shell 脚本中的变量 例如 MY COMMAND bin command dosomething 然后接下来 它通过执行以下操作将 参数 传递给 MY COMMAND MY ARG
  • 保存和恢复陷阱状态?管理多个陷阱处理程序的简单方法?

    有什么好的方法可以覆盖bash陷阱处理程序不会永久破坏可能已设置或尚未设置的现有处理程序 动态管理任意陷阱例程链怎么样 有没有办法保存陷阱处理程序的当前状态 以便以后可以恢复 在 Bash 中保存和恢复陷阱处理程序状态 我将提交以下堆栈实现

随机推荐

  • Git 提交作者信息 - Christian S. 到底是谁?

    我最近开始使用 git 我尝试按照设置用户信息的说明进行操作 但似乎出现了严重错误 test h git config list user name MY NAME user email MY EMAIL core repositoryfo
  • Meteor 访问令牌

    使用时Meteor http meteor com 与新的验证 https github com meteor meteor tree auth系统 我怎样才能获得facebook访问令牌 当登录时accounts facebook包裹 从
  • Silverlight 4:在 DataTemplate 中使用转换器时出现“无效的 XAML”

    也许你可以帮助我理解为什么当我尝试在 Visual Studio 2010 设计器中执行以下操作时收到未处理的异常 无效 XAML Page 我有一个Converter named DateTimeConverter将日期转换为德语日期字符
  • 在 C# .NET 中使用操作系统的文件类型映像

    我可以以某种方式使用操作系统中的文件类型图像并将其显示在我的应用程序中吗 如果您知道所需图标的文件的文件名 则可以使用ExtractAssociatedIcon http msdn microsoft com en us library s
  • “路径”参数值无效:不存在文件

    正如提到的Terraform 资源 执行应用时出现连接错误 https stackoverflow com questions 63613944 terraform resource connection error while execu
  • 自定义视图中的波纹效果

    我目前正在创建一个 Android 视图 其中当用户点击它时 我将在点击的坐标周围显示一种波纹 但我不确定该怎么做 我的第一个想法是使缓存无效并每次都使圆圈变大 但这样做似乎不合适也不高效 如果有人以前遇到过同样的问题并且愿意分享一些如何做
  • 独立启用/禁用功能区控件

    我已经多次寻找解决方案 最接近的解决方案是 Ron de Bruinexample http www rondebruin nl win s2 win013 htm但它并没有涵盖我所需要的 我想做的基本上是两件事 示例 我有 4 个按钮 G
  • 如何更改 Android 应用程序的主题?

    我正在开发一个 Android 应用程序 我想更改应用程序的颜色和主题 我怎样才能做到这一点 开发指南解释了如何应用主题和样式 http developer android com intl de guide topics ui theme
  • LUCENE:搜索与正则表达式匹配的术语

    我需要搜索 lucene 索引中的任何术语 匹配特定的正则表达式 我知道我可以使用TermsComponent在solr中 如果配置如下
  • 如何在javascript中创建没有键的json对象数组

    我想创建一个没有键的 JSON 对象数组 如何实现这一点 例如 8 0 2 20 0 2 var hh 9 var mm 8 var qty 2 var data data push hh mm qty 它给出的数据如下 hh 9 mm 8
  • 在特定 WordPress 页面上发送 404 状态代码?

    我需要在 WordPress 的特定页面上发送 404 状态代码 该页面未使用 404 php 模板 最好 我想在我的主题文件中执行此操作 而不是使用 htaccess 这是我所拥有的不起作用的东西 function my 404 if i
  • Kafka 中的“__consumer_offsets”主题是什么

    当我运行此命令时 我得到 2 个主题 我知道我创建了测试主题 但我看到了一个名为 consumer offsets 的附加主题 从名称上看 它与消费者抵消有关 但它是如何使用的呢 bin kafka topics sh list zooke
  • 停止 Spinner.js

    我正在使用 spin js http fgnass github com spin js http fgnass github com spin js 同时加载大的全宽 高图像 问题是我无法停止旋转器 stop 方法似乎不起作用 这就是我所
  • Android Web 视图中的动态进度条

    您好 我如何在其中添加页面加载进度 当页面完全加载时 进度条应该向上 我想将代码放在 case 语句中 提前致谢 这是代码 package com menu import android app Activity import androi
  • PHP 如何在没有 system() 或 exec() 的情况下 ping 服务器

    我正在尝试 ping 服务器 但我的主机被禁用exec and system 由于安全原因 是否还有其他选项可以让它工作 或者我是否必须要求我的主机启用它们 我得到的错误 警告 出于安全原因 system 已被禁用警告 出于安全原因 exe
  • 无法解决 select 语句中第 5 列的排序规则冲突

    我试图将多个字段的组合显示为一个 客户要求我这样做 我尝试了以下命令 但收到上述错误 SQL 片段 SELECT dbo VPayment 2 Serial dbo VPayment 1 Description dbo VPayment 2
  • 在Python中循环多个字典的最佳方法

    我搬字典 user name Bob age 11 place moon dob 12 12 12 user1 name John age 13 place Earth dob 12 12 12 通过加 1 循环遍历每个用户的最佳方法是什么
  • PHP 是如何工作的以及它的架构是什么?

    伙计们 最近我决定回到 PHP 并做一些比简单登录页面更复杂的事情 三年来我一直使用 Java JavaEE 进行编程 并且对 Java 应用程序的架构有很好的理解 基本上 一个虚拟机 一个简单的操作系统进程 运行称为字节码的编译代码 一个
  • Swift 优化级别破坏了 NSArray 到 Array 的转换

    以下 有点人为的 代码在以下情况下有效 快速优化级别被设定为无 Onone 默认用于调试 let nsa NSArray array foo bar let a nsa as String 但应用程序崩溃了 崩溃日志 http pasteb
  • 递归比较目录的 Shell 脚本

    我在外部硬盘驱动器上有一个几个月前的文件服务器备份 用于从那时起就出现故障的文件服务器 大部分数据已恢复到此后一直使用的临时文件服务器上 但存在一些不一致之处 我将安装外部并将其与当前数据同步 但首先我需要建立已在较新副本上更新的文件 我可