如何带条件执行“mv”命令 - 将具有特定结尾的文件移动到其他文件夹

如何带条件执行“mv”命令 - 将具有特定结尾的文件移动到其他文件夹

我是一名计算机科学专业的学生。上学第二年——我正在学习 Linux。由于冠状病毒,我以独立的方式学习。在我的学习过程中,我遇到了一个包含多个部分的问题 - 我无法解决它。

问题希望我执行mv命令 - 将一些文件传输到该文件夹​​。我尝试执行该mv命令 - 并尝试集成“pipe”或其他命令,例如find.

在我看来这不是一个正常的mv命令,需要集成更多的东西,我怎么也无法破译它。我尝试了几天来解决这个问题。我也尝试在论坛中找到类似的问题 - 但我找不到。

问题:

  1. 编写一个命令来复制以该文件夹.c结尾的所有文件。.hPrograms

我的尝试可能是这样做:

find "*.c" -o "*.h" | mv Programs

答案1

该作业可以用三种方式解释:

  1. 复制全部.c.h文件从当前目录到目录Programs,或者
  2. 复制全部.c.h文件从当前目录或其下面的任何位置到目录Programs
  3. 复制所有可访问的.c.h 从系统上的任何地方到目录Programs

请注意,作业说的是“复制”,而不是“移动”。这意味着您应该使用该cp命令,而不是mv.

作业的第一个解释是通过以下方式解决的

cp *.[ch] Programs

(假设*.[ch]匹配我们感兴趣的所有文件,并且当前目录中没有数千个文件)。

作业的第二种解释是通过以下方式解决的

find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

这将搜索当前目录中或当前目录下带有.c或文件名后缀的所有常规文件,并对每个此类文件执行。我们无法通过管道连接,因为该实用程序不读取其标准输入流。.hcpcp

我们还确保避免查看目录内部Programs(假设是当前目录中的子目录)。不这样做最终会将文件从Programs复制到Programs.看 ”解释 find 的 -path 和 -prune 选项“有关-path和 的更多信息-prune

第三种解释很容易从第二种解释中实现:

find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

...我们只需find要从目录树的顶部开始,并指定要Programs避免的目录是路径中的目录$PWD/Programs

由于您无法访问所有地方,这可能会给您带来许多错误。为了避免这种情况,还要删除您无法访问的目录并仅复制您可以读取的文件:

find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \
    -type f -name '*.[ch]' -readable -exec cp {} Programs \;

这需要 GNUfind进行-executable测试(如果目录是可执行的,则该目录是可搜索的)和-readable测试。

请注意,find此处的变体将文件限制为仅常规文件(通过测试-type f),而该cp *.[ch]方法将复制以这两个字符结尾的任何类型的内容。此外,该find解决方案将复制隐藏文件(名称以点开头的文件),而第一个解决方案默认情况下不会匹配这些类型的名称。

相关内容