我有一个名为的文件a_b-c-d-e-f.txt
。我想采用当前名称并交换破折号和下划线,使其变为a-b_c_d_e_f.txt
。
我的直觉告诉我应该尝试rename
或tr
,但我遇到了问题。这是我目前的尝试
#!/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
其他一些选择:
你的循环,但是用 sed 很少使用的
y
音译命令代替tr
ex。printf -v newFile "%s" "$(sed 'y/_-/-_/' <<<"$i")"
基于 perl
rename
的命令,使用 perl 的内置命令tr
(不需要 shell 循环)rename -n 'tr/_-/-_/' *[-_]*.txt
-n
(当您高兴时,删除它正在做正确的事情)。
答案3
答案4
for v in *.txt
do
newname=`echo $v | tr '_-' '-_'`
mv $v $newname
done
我发现这个方法有效。这是我的帖子和 Tony 的回复的组合。