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

时间:2011-10-07 18:47:23

标签: shell unix scripting

我一直在尝试编写一个脚本,它将获取当前工作目录,扫描每个文件并检查它是否是.txt文件。然后获取每个文件(这是一个文本文件),并检查它的名称中是否包含下划线,以及是否将下划线更改为连字符。

我知道这是一个很高的命令,但这是我到目前为止的粗略代码:

#!/bin/bash
count=1
while((count <= $#))
       do
          case $count in
               "*.txt") sed 's/_/-' $count
          esac
          ((count++))
done

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

无论如何,任何帮助将不胜感激!另外,我很抱歉我的代码太糟糕了,我对UNIX很新。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

为什么不:

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

答案 2 :(得分:0)

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

(未测试的)

答案 3 :(得分:0)

感谢所有输入人员!总而言之,我认为我发现的解决方案最适合我的技能水平:

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

这得到了我需要做的,为了我的目的,我不太担心空间。但是感谢你提出的所有好建议,你们都非常聪明!