我有 12 个名为 、 等的文件dmp_000
,dmp_001
一直到dmp_011
.我想将它们全部复制到rdmp_000
、rdmp_001
、 等,按顺序使编号文件一致。必须有一种简单的方法来做到这一点,而不是单独进行?
答案1
我使用这个命令生成一些示例数据
% for i in `seq 0 11`;do touch dmp_$(printf "%03d" $i);done
% ls
dmp_000 dmp_001 dmp_002 dmp_003 dmp_004 dmp_005 dmp_006 dmp_007 dmp_008 dmp_009 dmp_010 dmp_011
要复制文件并保留原始文件修改/创建日期:
% for i in dmp*;do cp -p "$i" "r${i}";done
% ls
dmp_000 dmp_002 dmp_004 dmp_006 dmp_008 dmp_010 rdmp_000 rdmp_002 rdmp_004 rdmp_006 rdmp_008 rdmp_010
dmp_001 dmp_003 dmp_005 dmp_007 dmp_009 dmp_011 rdmp_001 rdmp_003 rdmp_005 rdmp_007 rdmp_009 rdmp_011
将文件 wdmp* 移动到 rdmp*
% for i in wdmp*;do newname=$(echo $i|sed 's/^w/r/'); mv "$i" "$newname";done
笔记: 你也可以用@warl0ck 的回答为此,请使用该rename
命令。
答案2
如果 的使用zsh
是可以接受的,那么:
autoload -U zmv # load zmv
zmv -C 'dmp_(*)' 'rdmp_$1' # rename files
或者简单地在这种情况下:
zmv -C 'dmp_*' 'r$f'
($1
,$2
扩展到相应的(...)
组和$f
整个文件路径)。
看这个链接了解更多示例。
答案3
Posix 兼容,简短,如果您想扩展它,您的所有文件都可以作为位置参数 1-12 引用(在括号内)。
% ( set -- wdmp0[0-1][0-9] ;\
> for f ; do cp $f r${f#?} ; done )
答案4
尝试重命名命令,并且只重命名那些以dmp_
,
rename dmp rdmp dmp_*
要保留文件,请尝试像这样的替代方法,
for x in dmp_*; do cp $x r$x; done