我需要一个脚本的帮助,该脚本可 mv(重命名)在 ls 输出中用单引号显示的文件名或需要单引号进行文件操作的文件。该脚本将用于重命名目录中的所有文件。我使用可以在美国键盘上输入的每个可显示的非字母数字字符(“a/b”和“a'b”除外)创建了一批测试文件,以测试脚本:
touch 'a~b' 'a`b' 'a!b' 'a@b' 'a#b' 'a$b' 'a%b' 'a^b' 'a&b' 'a*b' 'a(b' 'a)b' 'a-b' 'a_b' 'a+b' 'a=b' 'a{b' 'a}b' 'a[b' 'a]b' 'a|b' 'a\b' 'a:b' 'a;b' 'a"b' 'a<b' 'a>b' 'a,b' 'a.b' 'a?b' 'a b'
所以现在我的测试目录包含:
psilo@deb:~/sh$ ls
'a$b' a#b 'a)b' a-b 'a<b' a@b 'a^b' 'a|b'
'a b' a%b 'a*b' a.b 'a=b' 'a[b' a_b a}b
'a!b' 'a&b' a+b a:b 'a>b' 'a\b' 'a`b' a~b
'a"b' 'a(b' a,b 'a;b' 'a?b' a]b a{b filenametweak.sh
另外,我个人偏好将 tr a space 改为 a 。和 a 的下划线。
我的脚本是:
#!/bin/bash
for file in *; do echo mv "$file" `echo $file | tr ' ' '.' | tr '_' '.' | tr -cd '\043\045\053-\056\060-\072\077\100-\132\135\141-\173\175\176'` ; done
我试图通过 tr 命令(带有 -c 和 -d 参数)从输入流中删除所有字符,而不是单引号之间显示的 ASCII 八进制值。这应该会产生一个输出,其中删除了我的“问题”ASCII 字符(那些需要在上面的 ls 输出中将文件名用单引号括起来的字符)。
我在脚本中的 mv "$file" 之前包含了 echo 命令,以便在扣动扳机之前测试输出。
但是,当脚本遇到“?”时或文件名中的“*”字符,它会产生不需要的输出:
psilo@deb:~/sh$ ./filenametweak.sh
mv a$b ab
mv a b a.b
mv a!b ab
mv a"b ab
mv a#b a#b
mv a%b a%b
mv a&b ab
mv a(b ab
mv a)b ab
mv a*b ab.a.b.ab.ab.a#b.a%b.ab.ab.ab.ab.a+b.a,b.a-b.a.b.a:[email protected]]b.ab.a.b.ab.a{b.ab.a}b.a~b
mv a+b a+b
mv a,b a,b
mv a-b a-b
mv a.b a.b
mv a:b a:b
mv a;b ab
mv a<b ab
mv a=b ab
mv a>b ab
mv a?b ab.a.b.ab.ab.a#b.a%b.ab.ab.ab.ab.a+b.a,b.a-b.a.b.a:[email protected]]b.ab.a.b.ab.a{b.ab.a}b.a~b
mv a@b a@b
mv a[b ab
mv a\b ab
mv a]b a]b
mv a^b ab
mv a_b a.b
mv a`b ab
mv a{b a{b
mv a|b ab
mv a}b a}b
mv a~b a~b
mv filenametweak.sh filenametweak.sh
文件名带有 * 或 时如何解决问题?遇到 - 或者 - 如何通过不同和/或更好的方法在 bash 中实现我的 mv 重命名意图?
答案1
我终于有时间在处理另一个项目时重新审视这个脚本,并解决文件名也包含问号的问题。
这是我的脚本解决方案,用于重命名当前工作目录中的所有文件,以便所有文件的命名方式不需要单引号或双引号进行文件操作:
#!/bin/bash
for file in *; do echo mv "$file" `echo "$file" | tr ' ' '.' | tr '_' '.' | tr -cd '\043\045\053-\056\060-\072\100-\132\141-\173\175\176'` ; done
如上所述,这将为tr
a 加上一个空格(八进制 40)字符,为a.
加上一个下划线 ( _
) .
- 这是我个人对 Linux 文件名的偏好。根据您的喜好进行调整。
我的目的是用来tr -cd
删除所有需要将文件名括在单引号或双引号中以进行文件操作的键入字符。这里的例外是右括号/右括号(八进制 135, ]
),它不需要单引号或双引号。为了保持一致性,我选择消除右/右括号,因为有趣的是,左/左括号(八进制 133, [
)确实需要单引号或双引号来进行文件操作。
- 使用以下命令测试脚本:
~$ touch 'test~`!@#$%^&*()-_+={}[]|\:;"<>,.? test' ~$ ls filenametweak.sh 'test~`!@#$%^&*()-_+={}[]|\:;"<>,.? test'
- 运行脚本。
- 结果:
~$ ls filenametweak.sh test~@#%-.+{}:,..test