如何基于CSV文件批量重命名文件(图像)


11

我所要实现的目标:

  1. 一个文件夹中有数千张图像。

  2. 我有一个包含以下列的CSV文件:

    A:原名B:重命名

    典型的行如下所示:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    我可以删除引号,这不是问题。

  3. 现在,我想使用一个应用程序或运行一个脚本,该脚本将搜索A列中的所有图像并将它们重命名为B列中的名称(例如,original-1.jpg->重命名为1.jpg)。

周围有一些答案,例如:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

但是,其中涉及一些脚本,因此我不确定所有这些脚本是否仅影响存储脚本的文件夹,或者它们是否可以重命名磁盘上满足某些条件的所有文件。当然,需要避免后者。

我正在寻找的是一个简单的指南,说明如何重命名文件以及如何选择包含文件的文件夹。

先感谢您。

Answers:


13

这应该为您工作:

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

说明:

  • sed 's/"//g' files.csv :删除引号
  • IFS=, :分割输入 ,
  • while read orig new; do ... done:这将读取每条输入行,将其分割为$IFS(此处为逗号)的值,并将第一个字段另存$orig$new
  • mv "$orig" "$new" :这将按要求重命名文件。

如果您的文件仅包含文件名(如orig.jpg),而没有路径(不/home/take2/orig.jpg相似),则上面的命令将仅影响当前目录中的文件。因此,您需要打开一个终端,cd进入目标目录并在其中运行它。

首先测试:

为了测试这一点,您可以先执行空运行,方法是打印将要运行的命令,而无需实际执行它们:

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

很好,这可以更好地解释。:)仅在运行前进行检查-我必须cd到目标目录并运行此行,或者我需要将该行另存为example.sh,然后从终端运行“ example.sh”?
2014年

@ take2,您可以直接运行该行。我更新了答案,使您可以查看将要运行的内容而无需实际更改文件,我建议您首先这样做。
terdon 2014年

太棒了,它有效!再说一件事-它关心列的标签是什么(目前它们分别是“ orig”和“ new”)还是只是将A列名称重命名为B列名称?
2014年

@ take2什么标签?不,它只使用第一个逗号分隔的字段并将其重命名为第二个。请注意,如果有两个以上的字段,它将把它重命名为该行的其余部分。只要您的输入文件与您发布的文件一样,它就会按预期工作。
terdon 2014年

顺便说一句。终端也显示“ mv:无法统计'orig':没有此类文件或目录”,尽管它确实重命名了该文件。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.