我是一名计算机科学专业的学生。上学第二年——我正在学习 Linux。由于冠状病毒,我以独立的方式学习。在我的学习过程中,我遇到了一个包含多个部分的问题 - 我无法解决它。
问题希望我执行mv
命令 - 将一些文件传输到该文件夹。我尝试执行该mv
命令 - 并尝试集成“pipe”或其他命令,例如find
.
在我看来这不是一个正常的mv
命令,需要集成更多的东西,我怎么也无法破译它。我尝试了几天来解决这个问题。我也尝试在论坛中找到类似的问题 - 但我找不到。
问题:
- 编写一个命令来复制以该文件夹
.c
结尾的所有文件。.h
Programs
我的尝试可能是这样做:
find "*.c" -o "*.h" | mv Programs
答案1
该作业可以用三种方式解释:
- 复制全部
.c
和.h
文件从当前目录到目录Programs
,或者 - 复制全部
.c
和.h
文件从当前目录或其下面的任何位置到目录Programs
。 - 复制所有可访问的
.c
和.h
从系统上的任何地方到目录Programs
。
请注意,作业说的是“复制”,而不是“移动”。这意味着您应该使用该cp
命令,而不是mv
.
作业的第一个解释是通过以下方式解决的
cp *.[ch] Programs
(假设*.[ch]
匹配我们感兴趣的所有文件,并且当前目录中没有数千个文件)。
作业的第二种解释是通过以下方式解决的
find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
这将搜索当前目录中或当前目录下带有.c
或文件名后缀的所有常规文件,并对每个此类文件执行。我们无法通过管道连接,因为该实用程序不读取其标准输入流。.h
cp
cp
我们还确保避免查看目录内部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
解决方案将复制隐藏文件(名称以点开头的文件),而第一个解决方案默认情况下不会匹配这些类型的名称。