mv将文件名重命名为_*_



举一个例子,我的文件名是A_BC_DEF_GH_IJ_LMNO_PQ_11111111_1111111111_111111_AB.dat.meta

我试图用unix命令重命名它,但当我尝试使用这个cmd 时

for f in *.meta; do mv "$f" "$(echo $f|sed s/[0-9]/?/g|sed 's/-/*/g')" ; done

我的文件被重命名为

A_BC_DEF_GH_IJ_LMNO_PQ_????????_????????????????????_???????_AB.dat.meta

预计会将文件重命名为

A_BC_DEF_GH_IJ_LMNO_PQ__????????_????????????????????_*_AB.dat.meta

我对unix cmd很陌生,有什么方法可以尝试吗?

由于[0-9]?正在进行文件名扩展,因此应该引用它们以避免出现严重的错误消息。考虑到这一点,我做了

echo A_BC_DEF_GH_IJ_LMNO_PQ_11111111_1111111111_111111_AB.dat.meta | sed 's/[0-9]/?/g'|sed 's/-/*/g'

并获得输出A_BC_DEF_GH_IJ_LMNO_PQAB.dat.meta,这对我来说很有意义。为什么你会期望在生成的文件名中有一个星号?在第二个sed命令中,将连字符变成星号,但输入中没有连字符。

当然,在文件名中使用问号和星号是非常不安全的,因为这只是在乞求麻烦,但没有法律规定你不能这样做。

A_BC_DEF_GH_IJ_LMNO_PQ_11111111_1111111111_111111_AB.dat.meta

将其与正则表达式匹配。记住sed中需要转义哪些字符。记住正确的引用——如果你写$,它应该在"里面。请注意,如果没有名为*.meta的文件,则它将只遍历字符串*.meta,除非设置了nullglob

$ touch A_BC_DEF_GH_IJ_LMNO_PQ_11111111_1111111111_111111_AB.dat.meta
$ for f in *.meta; do mv "$f" "$(echo "$f" | sed 's/[0-9]/?/g;  s/_(?*)_(?*)_(?*)_([^_]*)$/__1_2_*_4/')" ; done

最新更新