使用bash mangles文件从CSV映射重命名文件

时间:2018-05-09 23:29:08

标签: bash scripting

我正在尝试重命名自动生成的PDF文件,以便每个文件都包含要转到的用户的名称,使用当前名称的CSV地图为其新名称,使用我认为是直截了当的和bash shell中的简单脚本。

目录中的原始文件以Cover_Letter_1.pdfCover_Letter_2.pdf等格式命名,在CSV中,它们的格式如下:

Cover_Letter_1.pdf,Cover_Letter_User1.pdf
Cover_Letter_2.pdf,Cover_Letter_User2.pdf

我将CD放入目录(文件和CSV都是),并尝试了这个脚本:

sed 's/"//g' rename_list.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done

返回预览,准确显示我的预期:

mv Cover_Letter_1.pdf Cover_Letter_User1.pdf
mv Cover_Letter_2.pdf Cover_Letter_User2.pdf

sed 's/"//g' files.csv如果CSV文件中的文件名中有引号,则恰好不适用于第一组文件)

因此,我会删除echo以实际运行它,但结果是它会破坏文件,将它们转换为通用.file格式,并使用像P4L8I7~B.file这样的乱码名称/ p>

我运行了一个“预览”命令(例如mv Cover_Letter_2.pdf Cover_Letter_User2.pdf),只是为了确保脚本的一部分是正确的(确实如此)。

编辑:我只是想尝试运行sed 's/"//g' rename_list.csv | while echo IFS=, read orig new; do echo mv "$orig" "$new"; done,这会导致它在while循环中无限期地运行而没有明显的结束。我它会在文件中没有逗号的情况下终止,但是,如果我理解正确,它只是试图继续永久地读取行。

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式更改命令,如果它正确显示移动命令,它应该可以正常工作。

(sed 's/"//g' rename_list.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done) | bash

这将是:

mv Cover_Letter_1.pdf Cover_Letter_User1.pdf
mv Cover_Letter_2.pdf Cover_Letter_User2.pdf

作为命令并运行它。

在运行此命令之前备份文件。