举一个例子,我的文件名是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