尝试查找包含标识符的文件,然后将它们移动到终端内的新目录
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
,可能会被解释为 instead
或 else
。选项的顺序有所不同。
请注意第一个 category1
是要排除的目录名称,第二个 *Category1*
是要查找的文件名。
如果您不确定哪些文件是find
的结果,请尝试执行:
find /path_A -name 'Category1' -prune -o -type f -name '*Category1*' -print
然后调整选项以查看输出的变化。
我是这方面的初学者,似乎 运行 遇到了问题。 基本上,我在一个目录中有许多名称包含关键字(我们称之为 "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
,可能会被解释为 instead
或 else
。选项的顺序有所不同。
请注意第一个 category1
是要排除的目录名称,第二个 *Category1*
是要查找的文件名。
如果您不确定哪些文件是find
的结果,请尝试执行:
find /path_A -name 'Category1' -prune -o -type f -name '*Category1*' -print
然后调整选项以查看输出的变化。