如何基于文本文件将文件移动到子目录



我有一个目录,里面有大约2000个文件。

~/
-File 1.pdf
-File2.pdf
-Another file 1.pdf
-File3.pdf
-Someother file.docx
-Yeanother.pdf 

我已经将每个文件与其相关的帐户映射。此映射位于 CSV 文件中。

文件名目的地

File 1.pdf          | CompanyAccount1
File2.pdf           | CompanyAccount1
Another file 1.pdf  | CompanyAcountA
File3.pdf           | CompanyAccount5
Someother file.docx | AnotherAccount2
Yeanother.pdf       | CompanyAccount1

我想根据基于 csv(或文本文件)的帐户名称将文件从主目录移动到子目录中。

期望的结果

~/
-CompanyAccount1
--File 1.pdf
--File2.pdf
--Yeanother.pdf
-CompanyAcountA
--Another file 1.pdf
-CompanyAccount5
--File3.pdf 
-AnotherAccount2
--Someother file.docx

理想情况下,它会像mv < file-and-destination.csv一样简单,但我无法让它工作。我已经尝试过xargs mv < renaming.txt,但它没有按预期工作(有些被移动,然后其他所有内容都被移动到一个目录中)。

创建目录:

cut -f2 file-and-destination.csv |
xargs mkdir -p

这假定文本是制表符分隔的,并且没有文件名包含制表符。

如果文件名都不包含空格,您可以简单地xargs -n 2 mv <file-and-destination.csv但现在的方式(假设您的示例具有代表性),一个简单的while IFS=$'t' read -r file dir循环似乎是要走的路。

while IFS=$'t' read -r file dir; do
mv "$file" "$dir"
done <file-and-destination.csv

另一种解决方案是生成脚本来生成目录并移动文件。这个假设其中也没有带单引号的文件名;

sed $'s/\([^t]*\)t\(.*\)/mkdir -p '\2'; mv '\1' '\2''

这只会生成命令;如果结果看起来合理,则通过管道sh

我使用Bash"C风格的字符串$'...'为方便。如果你没有 Bash,特别是第二个需要一些重构。首先,您应该能够简单地删除美元符号并在单引号之间键入文本制表符(在许多 shell 中,control-vtab 用于在命令行上获取文字制表符)。

总而言之,我不推荐后一种技术。如果您可以控制输入文件格式,那么简单地destdir/filefile应该移动到destdir可能是一个更好的设计(因为在斜杠上拆分既简单又自然,现在您也可以使用带有制表符的文件名)。

最新更新