gpt4 book ai didi

bash - 如何根据某些 .csv 列移动文件?

转载 作者:行者123 更新时间:2023-12-04 18:39:39 26 4
gpt4 key购买 nike

我有一个训练集文件夹(/train),其中包含超过 100K 不同类别的图像。图像的类别在一个单独的 csv 文件中给出,如下所示:

hashed_id,country,continent,scientific_name,filename 
fd148672d8,United States of America,North America,nerodia-sipedon,fd148672d8.jpg

有一个包含这么多文件的文件夹,导致 Colab timeout .因此,我想为每个科学名称创建一个子文件夹,并将相应科学名称的图像移动到其中。
awk -F "," 'NR>1 {print $4}' train_labels.csv | head -1| xargs mkdir -p 

如果子文件夹尚不存在,此代码会为每个科学名称创建子文件夹。它使用逗号作为分隔符并忽略标题。
cp train/$(awk -F "," 'NR>1 {print $5}' train_labels.csv | head -1) $(awk -F "," 'NR>1 {print $4}' train_labels.csv | head -1)

此代码从文件夹/train 复制相应的子文件夹中的图像。请注意,我在这里仅对一张图像(头部 -1)进行测试。

我很高兴我走了很远,但是……这是最好的方法吗?感觉重复的太多了,想要一个更简洁的bash脚本。

最佳答案

您可以使用 awk 命令创建目录并移动文件,使用 system 完成所有操作。你可以这样做:

awk -F, 'FNR>1{ system("mkdir -p \"" $4 "\" && mv \"" $5 "\" \""$4"\"")}' manyfiles.csv

额外的引号转义使它看起来更复杂。额外的引号只是确保您的文件和目录名称被引用,以避免名称包含空格的任何问题。与 system() 命令一起形成和使用的命令是,例如:
mkdir -p "nerodia-sipedon" && mv "fd148672d8.jpg" "nerodia-sipedon"

如果没有所有额外的转义引号,您更容易理解发生了什么,那么您将拥有以下内容:
awk -F, 'FNR>1{ system("mkdir -p " $4 " && mv " $5 " "$4)}' manyfiles.csv

( 注意: 始终使用引用的版本)

其中 FNR>1 简单告诉 awk 忽略第一条记录(无需通过管道传输到 head/tail,其余的只是 system() 命令中的字符串连接,以生成创建目录和移动文件的命令。

这应该会大大减少移动文件的时间。 (在处理大量文件时—— 始终保留原始备份 ,以防万一出现问题或您想稍后再做其他事情——“您已被警告...” :)

关于bash - 如何根据某些 .csv 列移动文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60605215/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com