我有以下格式的文件:
$ 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 命令或其他会更好
rename
是perl
包的一部分。 它根据 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 位数字并将它们替换为空字符串。
不使用其他工具(如 rename
或 sed
)并严格坚持单独使用bash
:
for f in CombinedReports_LLL-*.csv
do
newName=${f/LLL-*(/LLL-(}
mv -i "$f" "$newName"
done
for f in CombinedReports_LLL-* ; do
b=${f:0:20}${f:34:500}
mv "$f" "$b"
done
您可以在外壳上逐行尝试:
f="CombinedReports_LLL-20140211144020(Untitled_11).csv"
b=${f:0:20}${f:34:500}
echo $b
rename
实用程序。它使用语法与 sed 非常相似来更改文件名。以下示例(来自重命名手册页)显示了如何从本地目录中的备份文件列表中删除尾随的".bak"扩展名:
rename 's/.bak$//' *.bak
我正在使用顶部响应中给出的建议,并将以下行放入 shell 脚本中:
ls *.nii | xargs rename 's/[f_]{2}//' f_0*.nii
在终端中,这一行工作得很好,但在我的脚本中它不会执行并将 * 作为文件名的文字部分读取。