在UNIX目录中重命名文件 - shell脚本

4
我一直在尝试编写一个脚本,它将获取当前工作目录,扫描每个文件并检查它是否为.txt文件。然后,对于每个文本文件,检查它的名称中是否包含下划线,如果是,则将下划线更改为连字符。
我知道这是一个很大的要求,但以下是我目前拥有的粗略代码:
#!/bin/bash
count=1
while((count <= $#))
       do
          case $count in
               "*.txt") sed 's/_/-' $count
          esac
          ((count++))
done

我认为这个脚本应该将当前工作目录中的文件作为参数,检查每个文件(由$count或"count"表示)。然后对于每个文件,它会检查它是否以".txt"结尾,并且如果是的话,会使用sed将每个下划线更改为连字符。我认为我遇到的主要问题之一是脚本没有从当前工作目录读取文件。我试过在运行脚本的命令之后包含目录,但我认为它是按行而不是按文件来处理的(因为每行有4个左右的文件)。

无论如何,任何帮助都将不胜感激!另外,我很抱歉我的代码如此糟糕,我非常新于UNIX。


一个问题是$count是变量count的值,它是一个整数。如果你想要迭代位置参数,你可以写成:for file in "$@"; do ... 或者简写为 for file; do ... - glenn jackman
请点击此处查看:http://theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html - Vijay
4个回答

2
for fname in ./*_*.txt; do
  new_fname=$(printf '%s' "$fname" | sed 's,_,-,')
  mv "$fname" "$new_fname"
done

2
如果使用的是bash shell,可以这样写:new_fname=${fname//_/-} - glenn jackman

1
为什么不这样做:
rename 's/_/-/' *.txt

重命名:找不到命令。这个问题是关于Unix的,而不是特定的Linux发行版。但是考虑到Perl几乎安装在任何地方,它是一个不错且灵活的解决方案。 - Roland Illig
2
@RolandIllig:我知道rename不是到处都有的,但从shebang中我假设它在一些现代类Unix系统上执行。 - Michał Šrajer

0

感谢大家的所有建议!总的来说,我认为我找到的解决方案是最适合我的技能水平的:

ls *.txt | while read -r file; do echo file |
   mv $file $(echo $file | sed 's,_,-,');
done

这个做到了我需要的,对于我的目的,我不太担心空格。但是感谢你们所有人提供的精彩建议,你们都非常聪明!


0
$ ls *.txt | while read -r file; do echo $file | 
  grep > /dev/null _ && mv $file $(echo $file | tr _ -); done

(未经测试)


这将在文件名中包含空格的文件上失败。如果您使用错误的 mv 命令,甚至可能会丢失一些数据。 - Michał Šrajer
是的,它会在包含空格的文件上失败。把空格放在文件名中的人应该失去所有数据。 :) - William Pursell
我有点同意... :-) 但是我们在这里互相学习,这就是为什么我添加了这个评论。问候。 - Michał Šrajer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接