我在一个目录中有多对前缀相同的文件,而其他文件并不是成对存在的.所有文件都以四位数字开头.我需要找到每对中最旧的文件,并将其重命名.例如,来自:

0772_old_file.md
0772_new_file.md

致:

0772_old_file.md_old
0772_new_file.md

对于我得到的一对文件,最远的位置是:

find . -name '0772*'| ls -rt | head -1

这会产生以下结果:

./0772_old_file.md

我预计将另一个管道放到xargs是重命名该文件的一种方法,但无法弄清楚其语法.

帮助重命名单个配对是向前迈出的一步.查找并重命名整个目录中每对文件中最旧的文件的bash脚本或一行程序甚至更好.

推荐答案

我将使用find来打印最后修改时间(从纪元开始的秒数)和名称(用空格分隔),使用sort来按最后修改时间从最新到最旧进行排序,使用awk来 Select 每对中最旧的,并使用while循环来重命名:

find . -type f -name '[0-9][0-9][0-9][0-9]_*' -printf '%T@ %p\n' | sort -nr |
  awk '{sub(/^[^ ]* /,""); p = substr($0,1,4); num[p]++; name[p] = $0}
       END {for(p in num) if(num[p] == 2) print name[p]}' |
  while IFS= read -r file; do mv "$file" "${file}_old"; done

find Select 名称以4位数字和下划线(-name '[0-9][0-9][0-9][0-9]_*')开头的所有文件(-type f),并打印它们的最后修改时间(从纪元开始的秒)、空格、文件路径和换行符(-printf '%T@ %p\n').

sort按数字(-n)和逆序(-r)排序.因此,更新的文件将首先出现.

awk脚本中,我们删除前导时间戳和后面的空格(sub(/^[^ ]* /,"")),将文件名的前4个字符前缀存储在变量p中(p = substr($0,1,4)),在数组num中计算具有该前缀的文件数(num[p]++),将最后遇到的具有该前缀的文件名存储在数组name中(name[p] = $0).在END处,我们循环数组num的所有键,并且如果计数为2,则打印数组name中的对应条目,其是遇到的具有该前缀的最后(第二个)名称,即,两个中最老的一个.

IFS=保留前导(但在本例中不能有前导空格,因为find Select 具有4个前导数字的文件)和尾随空格.

注意:如果您的文件名不包含换行符(但可以包含制表符或空格),则此方法有效.如果是这样,事情就稍微复杂一些,我们必须使用NUL字符(ASCII代码0)作为记录分隔符,因为它是唯一在文件路径中找不到的字符.使用GNU awk(其他一些awk不支持NUL记录分隔符):

find . -type f -name '[0-9][0-9][0-9][0-9]_*' -printf '%T@ %p\0' | sort -znr |
  awk -v RS='\0' '
    {sub(/^[^ ]* /,""); p = substr($0,1,4); num[p]++; name[p] = $0}
    END {for(p in num) if(num[p] == 2) printf("%s\0", name[p])}' |
  while IFS= read -d '' -r file; do mv "$file" "${file}_old"; done

sort(-z)、GNU awk(-v RS='\0')和read(-d '')中,我们指出记录是无分隔的.在findawk中,我们在每个记录的末尾打印NUL而不是换行符.

Linux相关问答推荐

在shell 中使用排除模式的grep

Flutter 构建错误:';DART:JS_interop';在此平台上不可用

无法放弃所有权限,但可以放弃 CAP_SETUID 权限.

线程创建会在 Linux 中触发页面错误吗?它与软脏 PTE 有什么关系?

awk 打印除最后一列以外的所有内容 + 最后一列

仅在 Linux 上出现 AWS RDS `flush tables` 错误的 mysqldump

当未在日志(log)中输入确切的时间戳时如何过滤日期范围内的值

如何在 shell 脚本中动态生成新的变量名?

何时判断 EINTR 并重复函数调用?

如何告诉 valgrind 对Forking 进程进行 memcheck?

如何从 linux 的命令行将 Sublime Text 2 文件打开到选项卡,而不是新窗口

如何在 Linux 中查找所有以 .rb 结尾的文件?

如何在python中找到文件或目录的所有者

为什么可执行文件操作系统依赖于?

如何分析内存使用情况?

如何在 Linux 中使用单行命令获取 Java 版本

仅使用 proc 获取本地网络接口地址?

Shell 脚本, echo 消息后在同一行读取

如何在 Linux 中查看日志(log)文件并在查看时应用自定义过滤器?

获取本地时区的 Olson TZ 名称?