移动文件名中的字符

时间:2015-12-18 03:48:47

标签: regex bash

我有一个文件夹,里面装满了名字为ab1234,abc5678等的文件,我想将它们切换到abc3412,abc7856等 - 只需将最后两个字符换成倒数第二个字符。两个字。文件名都是这种格式,没什么惊喜。使用正则表达式最简单的方法是什么?

2 个答案:

答案 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/' *