根据 csv 列表将具有匹配前缀的所有文件移动到文件夹

根据 csv 列表将具有匹配前缀的所有文件移动到文件夹

我有数千个带有各种前缀的文件,这些前缀分组在 csv 列表中。现在我想根据他们的列表将它们全部移动到他们的文件夹中。

例如:文件 A1B1C1_{...}.png、A1B2C2_{...}.png、A1B1C3_{...}.png 等 CSV 列表:

Name   Group
A1B1C1 John
A2B1C1 John
A1B2C2 Denver
A1B1C3 Nick

现在我想将所有带有 A1B1C1_ 和 A2B1C1_ 前缀的文件移动到 John 文件夹,将 A1B2C2_ 前缀移动到 Denver 文件夹,将 A1B1C3_ 前缀移动到 Nick 文件夹。

我在想

for group in *_*.csv; 
 do {...}

但我不确定如何从 csv 文件读取列表以及如何从列表语法移动文件。

我正在CentOS上工作,非常感谢。

答案1

awk 'NR > 1 { print $1, $2 }' list.csv |
while read -r prefix group; do
    find . -type f -name "$prefix*" -exec sh -c '
        group="$1"; shift
        mkdir -p "$group"
        for name do echo mv "$name" "$group"; done' sh "$group" {} +
done

这将用于awk为 while 循环提供前缀和组名称(跳过列表文件的文件头)。这假设所有前缀和组名称中都没有空格或制表符。

while 循环调用find查找当前目录中或当前目录下的所有常规文件,这些文件的名称以给定前缀开头。对于所有此类文件,将调用以下简短的 shell 脚本:

group="$1"
shift

mkdir -p "$group"
for name do
    echo mv "$name" "$group"
done

该脚本期望组名称是命令行上的第一个参数,其余参数是要移动到该组目录的文件的路径名。

该脚本会在当前工作目录中创建一个组目录(如果该目录尚不存在),然后循环遍历给定的路径名​​,将每个文件移动到位。不检查文件是否被覆盖。

保护echo免于mv实际运行。就地运行代码echo以确保其有效,然后删除echo.

答案2

像这样的脚本可以完成这项工作。将下面的代码视为元语言,只是为了让您了解如何做这些事情!

for i in `ls *.PNG`
do
a=$(echo $i | awk -F_ '{print $1}')
b=$(grep $a file.csv|awk '{print $2}')
mv $i $b/
done

相关内容