我有一个文件夹,里面装满了名字为ab1234,abc5678等的文件,我想将它们切换到abc3412,abc7856等 - 只需将最后两个字符换成倒数第二个字符。两个字。文件名都是这种格式,没什么惊喜。使用正则表达式最简单的方法是什么?
答案 0 :(得分:2)
根据您的平台,您可能拥有可以直接执行所需操作的rename
实用程序。
例如,anishsane's answer使用基于Perl的重命名实用程序显示了一个优雅的选项。
以下是符合POSIX标准的方式:
printf '"%s"\n' * | sed 'p; s/\(..\)\(..\)"$/\2\1"/' | xargs -L 2 mv
printf '"%s"\n' *
逐行打印当前文件夹中的所有文件(如果有子目录,则必须排除它们),并用文字双引号括起来。sed 'p; s/\(..\)\(..\)"$/\2\1"/'
生成2个输出行:
p
按原样打印输入行。s/\(..\)\(..\)"$/\2\1"/'
匹配输入行上的最后2个字符对(在结束"
之前)并交换它们。xargs -L 2 mv
然后读取输入行对(-L 2
)并调用mv
实用程序,每行作为自己的参数,这将导致所需的重命名。将每一行括在双引号中可确保xargs
将它们视为单个参数,即使它们应包含空格。对anishsane进行封闭的文字 - 双引号方法的提示,这使得解决方案更加健壮。
注意:如果您愿意使用非POSIX功能,可以按如下方式简化命令,以避免需要额外引用:
GNU xargs
:
printf '%s\n' * | sed 'p; s/\(..\)\(..\)$/\2\1/' | xargs -d '\n' -L 2 mv
非标准选项-d '\n'
告诉xargs
不要在行上执行单词拆分,并将每一行视为一个参数。
BSD xargs
(也适用于GNU xargs
):
printf '%s\n' * | sed 'p; s/\(..\)\(..\)$/\2\1/' | tr '\n' '\0' | xargs -0 -L 2 mv
tr '\n' '\0'
用\0
(NUL)字符替换换行符,然后将其指定为输入行分隔符char。对于具有非标准xargs
选项的-0
,再次确保将每个输入行视为单个参数。
答案 1 :(得分:2)
使用perl rename
?
rename 's/(..)(..)$/$2$1/' *