我必须根据 Excel 列表重命名大量文件(是的,我知道)。
因此,我的方法是将文件名从 Excel 导出 filenames.csv
为以下格式:
this_is_a_file.ext ; new_filename_1.ext
this_is_another_file.ext ; new_filename_2.ext
this is a filename with spaces.ext ; new_filename_3.ext
对于重命名,我想使用类似这样的 bash 脚本:
lstrn() {
while IFS= read -r line; do
oldfilename=`echo $line | awk '{print $1}'`
newfilename=`echo $line | awk '{print $3}'`
mv $oldfilename $newfilename
done < $1
}
我会采用以下方法:
$ lstrn filenames.csv
只要新旧文件名中都没有空格,这种方法就可以正常工作。
据我了解,是$1
具有旧文件名的文本块,是$2
的;
,而是$3
我的每行中的新文件名filenames.csv
。
我想我明白为什么这不适用于文件名中的空格...我需要替换该awk '{print $1}'
部分,对吗?
我完全不知道如何让它与空格一起工作,如果有人知道如何做到这一点我将非常感激!
如果我们可以假设您的文件名不包含
;
(这是一个很大的假设,;
在文件名中完全有效,因此您需要确定这一点),那么您只需读取输入文本文件,拆分;
并将结果保存在两个变量中,即可重命名:在这里,我们将输入字段分隔符(
IFS
)设置为 a;
,然后读取输入文件、拆分;
并将旧文件名和新文件名分配给各自的变量。现在,您的输入示例在 周围也有空格
;
。这意味着文件名不是,"this_is_a_file.ext"
但"this_is_a_file.ext "
有一个额外的空格,并且该文件不存在。因此,在运行上述命令之前,您需要删除这些多余的空格。您可以使用 来执行此操作sed
,告诉它将 a 周围所有两个或多个空格(*
即一个空格,然后是另一个空格和一个*
)的情况替换;
为;
:组合这两个命令即可得到您真正想要运行的命令:
一旦确定这是正确的输出,请删除
echo
并再次运行以实际重命名文件:可以
--
防止以 开头的文件名被破坏-
。请参阅终端命令中的“--”是什么意思?。