AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 687217
Accepted
Greg Plamondon
Greg Plamondon
Asked: 2022-01-21 09:01:41 +0800 CST2022-01-21 09:01:41 +0800 CST 2022-01-21 09:01:41 +0800 CST

根据文件名更改文件创建日期和时间

  • 772

我正在将 Asterisk 通话录音从我们的主服务器复制到 samba 共享,并且创建日期和时间已更改为当前日期和时间。

文件格式为:in-xxxxxxxxxx-xxxxxxxxxx-20211020-162749-1634761669.7921917.wav

粗体部分在 EPOCH 时间。我有数百个这样的文件,我需要根据文件名中的 EPOCH 时间戳更改文件的创建日期。谁能帮我?

files timestamps
  • 2 2 个回答
  • 1294 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2022-01-21T09:10:19+08:002022-01-21T09:10:19+08:00

    使用 GNU touch,您可以使用touch -d @1634761669.7921917 file将文件的最后修改时间设置为指定的纪元时间(即使此处的精度为亚秒级)。

    所以你可以这样做zsh:

    #! /bin/zsh -
    ret=0
    for file in *-<->.<->.wav; do
      t=${file:r} t=${t##*-}
      touch -d @$t -- $file || ret=$?
    done
    exit $ret
    

    如果它真的是创建时间,通常称为出生时间ls -l --time=birth,例如您想要更改的最新版本的 GNU报告ls,AFAIK 在 Linux 上是不可能的,除了将时钟更改回那个时间并再次创建文件。

    如果在 Linux(最新版本¹)上,您只能更改新time命名空间中的时钟,以免影响全局系统时钟。

    例如,使用:

    sudo unshare --time sh -c 'date -s @1634761669.7921917 && exec cp -a file file.new'
    

    您将创建一个出生时间接近的file.new副本file@1634761669.7921917

    $ sudo unshare --time sh -c 'date -s @1634761669.7921917 && exec cp -a file file.new'
    $ ls -l --time=birth --time-style=+%s.%N file file.new
    -rw-r--r-- 1 stephane stephane 0 1642699170.474916807 file
    -rw-r--r-- 1 stephane stephane 0 1634761669.792191700 file.new
    

    zsh然后可以编写上面的脚本:

    #! /bin/zsh -
    ret=0
    for file in *-<->.<->.wav; do
      t=${file:r} t=${t##*-}
      
      unshare --time sh -c '
        date -s "@$1" && exec cp -aTn -- "$2" "$2.new"' sh "$t" "$file" &&
        mv -f -- "$file.new" "$file" || ret=$?
    done
    exit $ret
    

    (并且需要作为 运行root)。

    重新审视这一点时,有些想法:

    我刚刚意识到这会导致一个潜在的问题:该unshare --timehack 允许将出生时间设置为过去的某个任意时间,但这也会导致更改状态时间(ls -lc例如报告的时间)设置为过去,指定的时间,加上制作副本所用的时间)。

    该ctime也不意味着可以任意设置。通过这样设置它,它可能会打破某些软件可能对这些文件做出的假设。例如,备份软件可能决定忽略它,因为它的 ctime 早于上次备份时间。

    因此,最好确保 ctime 没有在该命名空间中设置伪造的时钟时间,例如,仅在过去创建文件,但在当前复制其内容:

    unshare --time sh -Cc '
      umask 77 && date -s "@$1" && : > "$2.new"' sh "$t" "$file" &&
      cp -aT -- "$file" "$file.new" &&
      mv -f -- "$file.new" "$file"
    

    ¹您需要 Linux 内核 5.6 或更高版本,并CONFIG_TIME_NS在内核和util-linux2.36 或更高版本中启用。

    • 8
  2. Busindre
    2022-08-10T14:34:43+08:002022-08-10T14:34:43+08:00

    使用 time 命名空间 withunshare是不正确的。使用该date命令设置系统日期和时间时,会进行“CLOCK_REALTIME”类型的系统调用。

    此系统调用与时间命名空间不兼容,因此,即使使用时间命名空间 ( unshare -T) 的目的是不影响整个操作系统,它也不起作用。当使用带有 -T/--time 选项的 unshare 时,唯一会在新命名空间中生效的系统调用是 CLOCK_MONOTONIC/BOOTTIME(示例uptime命令)。

    要克隆访问和修改时间,可以使用 touch 的 -r 选项。

    touch target_file -r reference_file
    
    • 0

相关问题

  • 删除文件名后缀最小的文件

  • 列出根据特定内容行排序的文件

  • 如何提前知道 .zip 内部是否有父目录

  • 如何找到特定的文件类型并将它们 tar?

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve