我的目录中有如下文件名
example1.1.timestamp(.1457644337)
example1.2.timestamp
example1.3.timestamp
等等大约100个文件。我需要通过删除.timestamp(.1457644337)
末尾来重命名所有文件。
我设法为单个文件做到这一点
ls -l filename | sed 's/\.[^.]*$//'
答案1
使用rename
(prename
):
如果所有文件的时间戳都相同,则可以从包含文件的目录执行以下操作:
rename -n 's/\.1457644337$//' example1.*.*
对于不同的时间戳:
rename -n 's/\.\d+$//' example1.*.*
递归地:
find . -type f -name 'example1.*.*' -exec rename -n 's/\.\d+$//' {} +
-n
如果您对所做的更改感到满意,请删除(试运行)。
请注意,这将删除包含数字(包括 )的最后部分.
。因此,如果除了时间戳之外只有任何随机数,它也会被删除。
使用 shell 参数扩展:
如果所有文件的时间戳都相同:
for file in *.*; do mv -i "$file" "${file%.1457644337}"; done
对于不同的时间戳,假设
bash
(其他高级 shell 有类似的选项):shopt -s extglob; for file in *.*; do mv -i "$file" "${file%.+([0-9])}"; done
递归地:
find . -type f -name 'example1.*.*' -exec \
bash -ic 'shopt -s extglob; mv -i "$1" "${1%.+([0-9])}"' _ {} \;
在这里,我使用shell 选项通过使用模式extglob
来匹配最后一个之后的数字,因此替换参数扩展模式变为。.
+([0-9])
${file%.+([0-9])}
同样,这并不严格匹配时间戳。尽管您可以修改模式以获得鲁棒性,如果您有任何精确的时间格式。
答案2
交互式方式,带有视觉检查命令:
ls | vim -
里面vim:
:%s/.*/mv \0 \0/ ...move filename filename
:%s/\.[^.]*$// ...same as your sed regex
:w !sh ...run buffer with shell
:q! ...close without saving