重命名多个文件,在中间添加日期

重命名多个文件,在中间添加日期

我想重命名文件夹中的所有文件,包括名称中的当前时间戳,保留原始扩展名,在 Solaris 中,如下所示:

test1.txt > test1.日期.txt

我尝试了这个,但我丢失了名称的第一部分:

find * -prune -type f -name '*.txt' -exec mv {} {}.$(date +'%Y%m%d%H%M').txt \;

我错过了什么?

答案1

find . -type f -name '*.txt' -exec sh -c '
    now=$( date +%Y%m%d%H%M )
    for pathname do
        mv "$pathname" "${pathname%.txt}.$now.txt"
    done' sh {} +

这将找到当前目录中或当前目录下的所有常规文件的路径名,其名称以.txt.对于批量处理,会调用一个简短的 shell 脚本。该脚本将首先获取时间戳(为了提高效率,每个批次仅获取一次),然后循环遍历给定的路径名​​。

对于每个路径名,它将通过删除最后一个路径名.txt(使用${pathname%.txt})并添加一个点、时间戳和 来重命名.txt

这尚未在 Solaris 上进行测试,但仅使用标准组件和选项等。

要在调用之前仅计算一次时间戳,find请使用

now=$( date +%Y%m%d%H%M ) \
find ...as before (but without assigning to now)...

或者

env now="$( date +%Y%m%d%H%M )" \
find ...as before (but without assigning to now)...

(请注意上面两个命令的行连续性)

如果文件位于单身的目录,只需运行循环:

now=$( date +%Y%m%d%H%M )
for pathname in ./*.txt; do
    mv "$pathname" "${pathname%.txt}.$now.txt"
done

这假设该模式与./*.txt您要重命名的所有名称相匹配。

有关的:


你的{}.$(date +'%Y%m%d%H%M').txt不能便携工作。它可以与 的某些实现一起使用,但如果与另一个字符串一起出现,则find不需要实现扩展{}到当前路径名。{}

相关文字来自POSIX 标准是:

utility_name仅包含两个字符的 or 参数应{}替换为当前路径名。如果utility_name或 参数字符串包含这两个字符{},但不仅仅是这两个字符{},则 find 是否替换这两个字符或不更改地使用该字符串是实现定义的

答案2

另一种选择,虽然我不确定solaris它的兼容性如何......

from=txt
to=$(date +%Y%m%d%H%M).txt
find * -prune -type f -name "*.$from" -exec sh -c 'mv "$3" "${3%.$1}.$2"' sh "$from" "$to" {} ';'

无耻地从unix.stackexchangesh@Kulasananda 给出的链接,但我喜欢来自的调用为 组成变量的方式sh -c mv

甜的。

相关内容