从几个不同的目录收集文件并将它们放在一个地方

从几个不同的目录收集文件并将它们放在一个地方

我有大量的电子书,而且非常杂乱。其中一些单独存在于自己的目录中,一些已损坏,一些目录为空。如何从所有这些不同的目录中收集我的电子书,并将它们全部放在一个文件夹中,以便我可以阅读和重新组织它们?我更喜欢使用本机 GNU 命令或 bash 脚本。

答案1

我假设您至少将所有这些都放在单个父文件夹下的各个子目录中。就像是~/mybooks。如果是这样,您可以这样做:

find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +

.pdf这将找到名称以或.epub在目录中结尾的所有文件或目录~/mybooks,并将它们移动到目录中~/newdir。如果您可以拥有名称以.pdf或结尾的目录.epub,请添加-type f指令以仅获取文件:

find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +

答案2

要将目录树(即递归地在目录及其子目录中)中具有特定扩展名的所有文件移动到单个目录,在 zsh 中:

mv -i source/**/*.(pdf|epub) destination/

destination目录必须已经存在。source/如果要收集当前目录及其子目录下的文件,可以省略该部分。如果您想要移动所有文件(无论其名称如何),但不移动目录:

mv -i source/**/*(.) destination/

在bash中:

shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/

如果您有很多文件,这些命令可能会抱怨命令行太长。在这种情况下,您可以调用find而不是使用递归通配符。

find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +

如果现有的目录结构携带一些信息,那么您可能会发现创建更方便,而不是移动文件硬链接或者符号链接

要建立硬链接,请调用ln而不是mv -i.通过硬链接,每个文件将同时出现在两个位置。如果删除原始文件或新文件,另一个文件将保留:文件的两个位置处于平等地位。您可以判断某个文件具有硬链接,因为 输出中第二列中的数字ls -l大于 1。

要建立符号链接,首先更改到目标目录,然后调用ln -susing .(代表当前目录)作为目标。符号链接是一个文件,它只是说“看看那边的这个文件”。如果删除符号链接,不会影响原始文件。如果移动或删除原始文件,符号链接将变为悬挂状态(即它仍然存在,但不再指向文件)。

要删除目录下的空目录,可以使用

find /some/directory -depth -type d -empty -delete

相关内容