【发布时间】:2014-01-20 15:00:30
【问题描述】:
我有一个目录(用于 Endnote),里面装满了 PDF 文件(其中有 1000 个)。我使用 Unix 打印了所有 pdf 文件的列表,并将该列表保存为文本文件。这些 pdf 文件大部分位于我计算机中的其他目录中(重复)。
现在,我想使用 find 命令在我计算机的其余部分中搜索这些 pdf 文件的重复项,如果找到重复项,请将其移动到新目录。如果多次找到特定文件名,我想给每个文件一个唯一的名称(即 basename.pdf.1、basename.pdf.2 等)。最后,我想要一个目录来存放所有重复项,以便我可以仔细检查它们然后删除)。
但是,我不想查找创建我的列表的目录或我的 Dropbox,因为我不想移动这些 pdf 文件(只移动分散在我计算机中的其他 pdf)。
我已经找到(我认为)如何执行完成此任务所需的所有单个步骤,但我似乎无法将所有内容放在一起工作的 Unix 命令中。
1) 为了在排除目录的同时查找文件:
find -name "what to search for" -not -path "excluded_directory"
或
find build -not \( -path excluded_directory1 -prune \) -not \( -path excluded_directory2 -prune \) -name \*.what_to_find
或我目前最喜欢的
find . -name '*.what_to_find' | grep -v exludeddir1 | grep -v excludeddir2
2) 为了将文本文件读入 find 并将这些行用作搜索模式:
find . type f -print | fgrep -f file_list.txt
3) 查找和移动文件
find / -iname "*.what_to_find" -type f -exec mv {} /new_directory \;
或
find / -iname "*.what_to_find" -type f | xargs -I '{}' /new_directory
或(重命名文件,使具有相同名称的文件不会被彼此覆盖)。我还没有完全弄清楚这个命令中发生的一切......
find -name '*.what_to_find' -type f -exec bash -c 'mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
所以,我可以单独执行这些命令,但无法让它们按需要一起工作(也许我的命令顺序错误?其他问题?)。
find . type f -print | fgrep -f file_list.txt | grep -v excludeddir1 | grep -v excludeddir2 -exec bash -c 'echo mv -v "$0" "./$( mktemp "$( basename "$0" ).XXX" )"' '{}' \;
非常感谢任何帮助! 谢谢, 井架
【问题讨论】:
-
这几天有几个问题非常相似。尝试搜索
[bash]|[linux] find move|rename|ed 项目代表唯一实体。不要尝试搜索那个确切的字符串,你不会得到任何东西。祝你好运。