自从我准备一本书以来,我收集了大量的花卉图片。我将只使用包含在名为 choosen.txt(实际上是 csv)的文件中的其中一些。我必须从以这种方式组织的文件夹树中选择所选的:
Pictures
├── Flowers 2020
│ ├── 1.- Spring 2020
│ ├── 2.- Summer 2020
│ ├── 3.- Autumn 2020
│ └── 4.- Winter 2020
└── Flowers 2021
├── 1.- Spring 2021
├── 2.- Summer 2021
├── 3.- Autumn 2021
└── 4.- Winter 2021
10 directories, 5260 files
并将每一张选择的花卉图片复制到一个名为 Chosen-ones 的新文件夹中(例如)。希望我已经正确解释了我需要做的事情。
下面是 csv 文件的一些行chosen.txt
DSC10233.jpg
DSC10276.jpg
DSC10288.jpg
DSC10399.jpg
DSC10448.jpg
DSC10489.jpg
DSC10492.jpg
是否可以使用 Bash 或 Python 脚本?
提前致谢。
当然,你可以用一个非常小的 Bash 脚本来做到这一点。
我假设
chosen.txt
您的主目录中有该列表,其中 Pictures 是一个子目录。如果不是这种情况,请相应地调整路径。首先创建要移动文件的目录。我假设你刚刚打开了一个终端并且你在你的主目录中。您可以稍后移动目录。
现在检查您是否可以使用您的列表找到正确的文件,如下所示:
如果结果看起来正确,您可以通过调整命令来复制文件:
我们可以让它看起来更好一点:
解释
while read -r line; do things; done < input-file
只要while
条件成立,循环就会继续做某事。在这里,我们要求逐行读取我们的列表。每一行都将被放入变量line
中,以便我们可以在其上运行一些命令。当我们在该行完成命令时,将读取下一行,直到我们用完文件中的行。find path -name "$line"
该find
命令从给定的路径(在我们的例子中为图片)进行递归搜索。在这里,我们使用该-name
选项来查找与列表中名称匹配的文件。-ls
该find
命令具有列出找到的文件的选项。这对于在采取任何行动之前检查发现的内容很有用-exec command {} \;
-exec
查找选项对已找到的文件运行给定的命令(由表示{}
)cp -vt
该-v
选项cp
告诉我们它在做什么。该-t
选项指定目标(我们在其后立即给出目标目录);否则目的地将被假定为最后一个参数。是的,在命令行上有几种方法可以做到这一点。
假设您只有一个文件名列表(没有路径),您可以使用
while
循环读取“chosen.txt”文件,find
在源文件夹中查找文件,并使用另一个while
循环复制它们。定义变量可让您重新使用长命令,而无需对其进行编辑。
或单行:
如果您的原始 .csv 文件还包含文件的路径,另一种方法是从中构建一个列表。然后,您可以使用
rsync
选项--files-from=
通过维护源的原始目录结构来复制它们。