将文件名中的一个字符与另一个字符交换

将文件名中的一个字符与另一个字符交换

我有一个名为的文件a_b-c-d-e-f.txt。我想采用当前名称并交换破折号和下划线,使其变为a-b_c_d_e_f.txt

我的直觉告诉我应该尝试renametr,但我遇到了问题。这是我目前的尝试

#!/bin/bash
for i in *.txt; do
  [ -f "$i" ] || break
  newFile=$(echo "$i" | tr '-' '_')
  cp "$i" $newFile
done

有了这个,我最终

a_b_c_d_e_f.txt

ab 之间的部分不应该改变。此外,该破折号不一定总是位于文件名中的该位置。例如,它可能看起来像

a-b-c_d-e-f.txt

或者任何这样的组合。我希望它们翻转,而不管它们在名称中的位置。

答案1

$ echo "a-b_c" | tr '_-' '-_'
a_b-c

答案2

其他一些选择:

  1. 你的循环,但是用 sed 很少使用的y音译命令代替trex。

    printf -v newFile "%s" "$(sed 'y/_-/-_/' <<<"$i")"
    
  2. 基于 perlrename的命令,使用 perl 的内置命令tr(不需要 shell 循环)

    rename -n 'tr/_-/-_/' *[-_]*.txt
    

    -n(当您高兴时,删除它正在做正确的事情)。

答案3

rename手动的) 只是

rename 'y/_-/-_/' *.txt

这里有更多信息y/(音译)。另请查看这篇相关文章关于rename

答案4

for v in *.txt
do
    newname=`echo $v | tr '_-' '-_'`
    mv $v $newname
done

我发现这个方法有效。这是我的帖子和 Tony 的回复的组合。

相关内容