bash删除文件名的一部分

时间:2014-02-11 02:26:48

标签: bash shell sed rename mv

我有以下格式的以下文件:

$ ls CombinedReports_LLL-*'('*.csv
CombinedReports_LLL-20140211144020(Untitled_1).csv
CombinedReports_LLL-20140211144020(Untitled_11).csv
CombinedReports_LLL-20140211144020(Untitled_110).csv
CombinedReports_LLL-20140211144020(Untitled_111).csv
CombinedReports_LLL-20140211144020(Untitled_12).csv
CombinedReports_LLL-20140211144020(Untitled_13).csv
CombinedReports_LLL-20140211144020(Untitled_14).csv
CombinedReports_LLL-20140211144020(Untitled_15).csv
CombinedReports_LLL-20140211144020(Untitled_16).csv
CombinedReports_LLL-20140211144020(Untitled_17).csv
CombinedReports_LLL-20140211144020(Untitled_18).csv
CombinedReports_LLL-20140211144020(Untitled_19).csv

我希望删除这部分内容:
20140211144020(这是报告运行的时间戳,因此会有所不同)

并最终得到类似:

CombinedReports_LLL-(Untitled_1).csv
CombinedReports_LLL-(Untitled_11).csv
CombinedReports_LLL-(Untitled_110).csv
CombinedReports_LLL-(Untitled_111).csv
CombinedReports_LLL-(Untitled_12).csv
CombinedReports_LLL-(Untitled_13).csv
CombinedReports_LLL-(Untitled_14).csv
CombinedReports_LLL-(Untitled_15).csv
CombinedReports_LLL-(Untitled_16).csv
CombinedReports_LLL-(Untitled_17).csv
CombinedReports_LLL-(Untitled_18).csv
CombinedReports_LLL-(Untitled_19).csv

我只是按照mv命令的思路思考,可能是这样的:

$ ls CombinedReports_LLL-*'('*.csv

但也许sed命令或其他更好

5 个答案:

答案 0 :(得分:12)

renameperl包的一部分。它根据perl样式的正则表达式重命名文件。要从文件名中删除日期:

rename 's/[0-9]{14}//' CombinedReports_LLL-*.csv

如果rename不可用,则可以使用sed + shell

for fname in Combined*.csv ; do mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')" ; done

以上循环遍历每个文件。对于每个文件,它执行mv命令:mv "$fname" "$(echo "$fname" | sed -r 's/[0-9]{14}//')",在这种情况下,sed能够使用与上面rename命令相同的正则表达式。 s/[0-9]{14}//告诉sed连续查找14位数字,并用空字符串替换它们。

答案 1 :(得分:6)

不使用其他工具,例如renamesed,并严格遵守bash

for f in CombinedReports_LLL-*.csv
do
  newName=${f/LLL-*\(/LLL-(}
  mv -i "$f" "$newName"
done

答案 2 :(得分:1)

for f in CombinedReports_LLL-* ; do
    b=${f:0:20}${f:34:500}
    mv "$f" "$b"
done

您可以在shell上逐行尝试:

f="CombinedReports_LLL-20140211144020(Untitled_11).csv"
b=${f:0:20}${f:34:500}
echo $b

答案 3 :(得分:0)

您可以使用rename实用程序。它使用类似于sed的语法来更改文件名。以下示例(来自重命名手册页)显示了如何从本地目录中的备份文件列表中删除尾随的“.bak”扩展名:

rename 's/\.bak$//' *.bak

答案 4 :(得分:0)

我正在使用顶部响应中给出的建议,并将以下行放入shell脚本中:

ls *.nii | xargs rename 's/[f_]{2}//' f_0*.nii

在终端中,这行完美无缺,但在我的脚本中它不会执行并读取*作为文件名的文字部分。