有没有办法在保留原始创建/修改/读取时间的情况下重命名文件? 这是在 Solaris 中。
提前致谢。
我认为你不能用
mv
做到这一点。但是,您可以使用 cp -p
;将文件复制到新名称,然后删除原始文件。 -p
标志保留时间戳。
不过你会得到一个新的 inode...这是你不会的
mv
其他人建议的主题的变体:
cp -al "$oldname" "$newname"
unlink "$oldname"
只要 $oldname 和 $newname 位于同一挂载点(文件系统)上,就应该避免任何复制。
你很幸运。
Solaris(带有 ZFS)是极少数实际上尊重文件创建时间属性的文件系统之一。
现在正题:不,你不能保留所有时间:inode 会改变,文件名也会改变。这意味着 inode ctime 将根据 (POSIX) 定义进行更改。
您上次访问的时间也会改变,除非您正在运行 noatime 挂载点(zfs set atime=off)。
我认为没有办法改变这一点。但是,文件创建日期时间根本不应更改。 我本来打算展示显示创建时间的命令,但不幸的是我手边没有 Solaris 盒子,而且我似乎找不到它。我认为你最好的选择是
man ls find stat
。
GL
您或许可以使用
cp -p
,然后删除原件。
touch 命令可以强制文件修改时间,但我不确定这是否适用于 ZFS。如果您要重命名大文件,这比 cp -p 的开销更低。这是一个 bash 脚本:
oldFileTime=`find "$1" -maxdepth 0 -printf "%Ty%Tm%Td%TH%TM.%.2TS"`
mv "$1" "$2"
touch -t "$oldFileTime" "$2"
哎哟!
看来这个问题确实应该有一个更简单的解决方案。 我想对目录中的文件进行一些自动编号,我想出的保留时间戳的唯一解决方案是使用 rsync -aHv 将所有内容复制到具有新名称的不同目录,然后擦除旧目录并将其替换为新的。 它有效,但是呃...
我对前几百个文件这样做了,但我需要一些更干净、更简单的东西。 然后我在这里的一个线程中偶然发现了重命名命令
Perl 重命名命令将编号规则添加到文件夹和文件名 (Linux)
Larry Wall 用 Perl 写了一个重命名命令! 多酷啊! 唯一需要注意的是它不适用于 cp 或 mv 这样的输入和输出文件,它适用于正则表达式。 因此,而不是
mv oldfile newfile
你必须做这样的事情
rename -n "s/oldfile/newfile/" *
我认为这是因为这个命令更多地用于一堆文件而不是单个文件,尽管它可以与一个文件一起使用,但不像 cp。 我有一个文件列表,我想用零填充和时间戳自动编号。 重命名是一个非常优雅的解决方案,我使用了这样的命令
ls -rt | rename -n 'BEGIN{$a="001"} s/^/blah - $a - /;$a++'
这会将目录中的所有文件从“name”重命名为“header - 001 - name”,按升序(第一个文件在前,最后一个文件在最后)或 FIFO。 非常好的解决方案,因为第一种方法需要花费几个小时来复制所有目录并复制所有数据,而这种方法即使对于大量文件也只需要不到一分钟。 保留所有时间戳。 仅在完成测试后将 rename -n 更改为 rename -v。
我使用的是ubuntu linux,我安装的是使用
sudo apt install rename
但显然如果你安装了 perl,它会附带这个名为 prename for perl rename 的命令。 因此,只要您的 Solaris 系统有 Perl,或者您可以安装它,它就应该可以使用 prename 来工作。 这是该命令的教程
https://loopedline.com/post/renaming-files-with-rename-command-the-perl-version/
它的语法与 Perl 基本相同。 如果 Perl 没有安装,也许您可以以用户身份安装它并以这种方式使用它。 这是一篇讨论如何在 Solaris 上执行此操作的帖子,但我无法确认它是否有效。
在 Solaris 11 主机中安装 perl 版本 5.26.3 的步骤
当我使用 Solaris 时,Perl 通常已经安装,但我知道情况并非总是如此。 如果已安装但 prename 不存在,您可以使用 cpan 安装它
perl -MCPAN -e 'install File::Rename'
您可能还需要有关使用基本正则表达式的教程,特别是搜索和替换。 这是一个
https://perldoc.perl.org/perlretut
祝你好运!