【问题标题】:How to move files to a sub-directory based on a text file如何根据文本文件将文件移动到子目录
【发布时间】:2019-01-02 07:50:54
【问题描述】:

我有一个目录,里面有大约 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,但它没有按预期工作(一些被移动,然后其他所有东西都被移动到一个目录中)。

【问题讨论】:

  • 请分享您的尝试...
  • 还有一些工作示例......当您说文件“与”帐户“相关”时,您的意思是“拥有”吗?
  • 在 CSV 上循环,读取值(帐户和文件名),如果不存在则创建目录“帐户”,将“文件名”移动到该目录中,继续循环。没有尝试,没有免费代码:-)
  • 我对此做了很多变体,xargs -I {} mv {}

标签: linux bash macos shell mv


【解决方案1】:

创建目录:

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-v tab 以在命令行上获取文字制表符)。

总而言之,我不推荐后一种技术。如果您可以控制输入文件格式,只需将destdir/file 表示应将file 移动到destdir 可能是一个更好的设计(因为斜线分割既简单又自然,现在您可以拥有文件名称也带有标签)。

【讨论】:

  • 第一个解决方案有效。我在循环中添加了一个 mkdir 命令,但是您的解决方案最好避免在多个文件进入单个目录时出现一堆错误。我还将选项卡更改为管道,因为它更容易。
  • 如果这有助于解决您的问题,请考虑支持和/或接受。另请参阅help
猜你喜欢
  • 2014-06-06
  • 2021-07-12
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多