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)
我错过了什么?
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
,但{}
如果{}
与另一个字符串一起出现,则不需要实现扩展到当前路径名。
甲
utility_name
或者仅含有两个字符参数{}
应由电流路径名来代替。如果一个utility_name
或参数字符串包含这两个字符{}
,但不仅仅是这两个字符{}
,则 find 是替换这两个字符还是不更改地使用字符串是实现定义的。