我想重命名文件夹中的所有文件,包括名称中的当前时间戳,保留原始扩展名,在 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
。
甜的。