尝试查找包含标识符的文件,然后将它们移动到终端内的新目录

Trying to find files containing an identifier, then move them to a new directory within terminal

我是这方面的初学者,似乎 运行 遇到了问题。 基本上,我在一个目录中有许多名称包含关键字(我们称之为 "Category1")的文件。例如:

ABC-Category1-XYZ.txt

我正在尝试将它们从一个目录移动到与关键字同名的另一个目录。

我从这个开始:

find /path_A -name "*Category1*" -exec mv {} /path_A/Category1 \;

它吐出了这样的东西:

mv: rename /path_A/Category1 to /path_A/Category1/Category1: Invalid Argument

所以我做了一些摆弄,并假设问题是由试图将目录 Category1 移动到自身的命令引起的(可能)。我决定从搜索中排除目录,因此它只会尝试移动文件。我想到了这个:

find /path_A -name "*Category1*" \(! -type d \) -exec mv {} /path_A/Category1 \;

这确实将文件从它们的原始位置移动到了我想要的位置,但它仍然给我这样的信息:

mv: /path_A/Category1/ABC-Category1-XYZ.txt and /path_A/Category1/ABC-Category1-XYZ.txt are identical

我不是专家,所以我可能是错的...但我相信该命令正在尝试从原始目录中查找并移动文件,然后再次找到它们。目录 Category1 是起点 /path_A 的子目录,所以我相信它正在找到它刚刚在目录 Category1 中移动的文件并尝试再次移动它们。

谁能帮我解决这个问题?

您正在创建 find 尝试处理的新文件。最安全的方法是将它们移动到别处,而不是在您使用 find 搜索的 path_A 中。

或者如果您没有任何其他目录匹配,您可以使用修剪忽略该目录:

find /path_A -name '*Category1*' -prune -type f -exec mv {} /path_A/Category1/ \;

虽然另一个post已被接受,让我post一个正确的答案。
你能试试吗:

find /path_A -name 'Category1' -prune -o -type f -name '*Category1*' -exec mv -- {} /path_A/Category1/ \;

选项-prune与其说是条件,不如说是命令。它告诉 find 忽略条件 before -prune 指定的目录树。 在本例中,它从搜索中排除了目录 Category1。 下面的 -o 是合乎逻辑的 OR,可能会被解释为 insteadelse。选项的顺序有所不同。
请注意第一个 category1 是要排除的目录名称,第二个 *Category1* 是要查找的文件名。

如果您不确定哪些文件是find的结果,请尝试执行:

find /path_A -name 'Category1' -prune -o -type f -name '*Category1*' -print

然后调整选项以查看输出的变化。