我有数千个带有各种前缀的文件,这些前缀分组在 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