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

Vla*_*zin 5 bash solaris find shell-script mv

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

test1.txt > test1.date.txt

我试过这个,但我失去了名字的第一部分:

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

我错过了什么?

Kus*_*nda 9

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 {} +
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

或者

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

(注意上面两个命令中的续行)

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

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

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

有关的:


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

POSIX 标准中的相关文本

utility_name或者仅含有两个字符参数{}应由电流路径名来代替。如果一个utility_name或参数字符串包含这两个字符{},但不仅仅是这两个字符{},则 find 是替换这两个字符还是不更改地使用字符串是实现定义的

  • @D.BenKnoble 他们不会以破折号开头。`find` 会将搜索路径(至少是 `./`)添加到每个路径名,并且由于我编写模式的方式,循环替代方法也将始终在任何文件名之前使用 `./`。 (2认同)