递归比较目录的 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 脚本 的相关文章

  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 如何获取与 shell 中的文件名模式匹配的所有文件的总文件大小?

    我正在尝试仅使用 shell 来计算与文件名模式匹配的所有文件 在目录树中 的总大小 以字节为单位 这是我到目前为止所拥有的 find name undo exec stat c s awk 总计 1 END 打印总计 有没有更简单的方法来
  • shell脚本中的“##”是什么意思? [复制]

    这个问题在这里已经有答案了 在编写脚本时 我遇到了这个命令 f file 我很想知道 什么是 这行是什么意思 In bash 它删除了前缀模式 在这里 它基本上为您提供了最后一个路径分隔符之后的所有内容 通过贪婪地删除前缀 后面跟随任意数量
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • 如何根据 Bash 中的 VI 模式更改光标形状?

    我的 bashrc 中有以下行 set o vi 我希望我的光标在插入模式下具有管道形状 在命令模式下具有块形状 就像我在 vimrc 中放置以下内容时在 Vim 中的形状一样 let t SI e 6 q let t SR e 4 q l
  • system 和 shell_exec 之间的区别

    有什么区别shell exec and systemPHP 中的方法 两者都采用单个命令行参数并在 PHP 中运行 使用其中一种比另一种更好吗 请参阅此处的解释 http chipmunkninja com Program Executio
  • 如何比较两个文件中的多列并在找​​到匹配时从另一列检索相应的值

    我有两个文件 File1 txt 和 File2 txt 我需要将 File1 中的三列 1 2 和 3 分别与 File2 的 4 5 和 6 进行比较 如果找到匹配项 我想从 File2 的第 2 列中检索相应的值并将其粘贴到输出中 T
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • 如何使用 Bash 编写二进制文件?

    我的问题是我需要创建一个包含以下确切字节的文件 48 00 49 00 我不能使用C perl 其他脚本语言 目标是嵌入式设备 我使用 awk 尝试过 在桌面上它确实有效 awk BEGIN printf c c c c 48 00 49
  • 使用 sed 查找并替换包含非转义字符的变量

    我可以使用它来查找 fly 的所有实例 并将其替换为文件中的 insect sed i s fly insect g animals txt 如何找到 BASH 变量并将其替换为另一个 BASH 变量 例如 name echo fly ca
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 关键字“if”如何测试一个值是真还是假?

    在 bash 脚本中 if 1 then echo Yes else echo No fi Output Yes 它表示 1 被视为真值 但在代码中 word Linux letter nuxi if echo word grep q le
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • Bash - 将键绑定到字符串(不是函数)

    如何获得键绑定以导致在命令行插入任意文本 在 zsh 中我这样做 bindkey s m myspecialscript 在 bash 中 有等效的吗 没有一个内置函数可以实现我想要的功能 bind e E home yourscript
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 在 byobu 选项卡中启动命令的脚本

    我已经使用 screen 来启动服务器进程 以便稍后我可以在需要时附加并再次分离以继续执行其他操作 它工作得很好 但我最近发现了 byobu 我真的很喜欢它 我想使用相同类型的脚本来运行服务器 但我想将其附加到 byobu 选项卡 而不是屏
  • 如何从 LaTeX 执行 shell 脚本?

    我正在尝试在 LaTeX 中执行以下操作 documentclass article begin document execute usr local bin my shell script sh end document 想法是执行 us

随机推荐

  • 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 脚本

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