从终端处理大量图像,这些图像的名称存储在 csv 文件中

从终端处理大量图像,这些图像的名称存储在 csv 文件中

如何复制 CSV 文件第二列中的所有图像并将它们放入名为 images 的新文件夹中?它有大约 30 万张图像,所以我想知道是否有一种快速的方法(比如我有 12 个处理器):

[jalal@goku cleaned_affenet_manually_annotated]$ head -5 modified_training_for_FER2013.csv 
,subDirectory_filePath,expression
0,689/737db2483489148d783ef278f43f486c0a97e140fc4b6b61b84363ca.jpg,3
1,392/c4db2f9b7e4b422d14b6e038f0cdc3ecee239b55326e9181ee4520f9.jpg,6
2,468/21772b68dc8c2a11678c8739eca33adb6ccc658600e4da2224080603.jpg,6
3,944/06e9ae8d3b240eb68fa60534783eacafce2def60a86042f9b7d59544.jpg,3
[jalal@goku cleaned_affenet_manually_annotated]$ wc -l modified_training_for_FER2013.csv 
283903 modified_training_for_FER2013.csv

答案1

echo ",subDirectory_filePath,expression
0,689/737db2483489148d783ef278f43f486c0a97e140fc4b6b61b84363ca.jpg,3
1,392/c4db2f9b7e4b422d14b6e038f0cdc3ecee239b55326e9181ee4520f9.jpg,6
2,468/21772b68dc8c2a11678c8739eca33adb6ccc658600e4da2224080603.jpg,6
3,944/06e9ae8d3b240eb68fa60534783eacafce2def60a86042f9b7d59544.jpg,3
" |  sed -r '1d;s/,(.*\.jpg),.*/\1/' | while read f; do echo "copy $f to dir/$f"; done 
  • 1d;删除第一行(标题)。
  • s/from/to/ 将带有前缀后缀的文件名替换为纯文件名。
  • while 循环回应复制命令但也可以执行复制。

目录名称可能不存在(689、392,...)。如果您想展平文件层次结构,这是可能的,但可能会导致覆盖。cp --parents如果不存在父目录,则生成父目录。

直接在路径上工作就像

sed -r '...' modified_training_for_FER2013.csv | while ...

据我所知,使用 12 个处理器不会有太大帮助,因为瓶颈应该是文件 IO 和硬盘使用情况。

答案2

这应该会有所帮助:

sed -r '1d;$d; s/^.*\/(.*\.jpg),./\1/g' mona.csv | xargs -i cp {} /path/to/images

如果文件位于其他地方但csv文件中有其名称,则要移动它们,请执行以下操作:

sed -r '1d;$d; s/^.*\/(.*\.jpg),./\1/g' mona.csv | xargs -i cp /path/to/files/{} /path/to/images

信息:

  1. 1d;1$:删除第一行和最后一行

相关内容