需求:将当前文件夹以及所有子文件夹下的所有.cpp文件,拷贝到指定文件路径/home/majn/llvm_project/llvm_cpp_test_suite下
以下是一个用于实现该功能的 Bash 脚本。它会递归地查找当前文件夹和所有子文件夹下的.cpp
文件,并将它们拷贝到/home/majn/llvm_project/llvm_cpp_test_suite
这个目录下。
#!/bin/bash
# 目标文件夹路径
DEST_FOLDER="/home/majn/llvm_project/llvm_cpp_test_suite"
# 检查目标文件夹是否存在,如果不存在则创建
if [ ! -d "$DEST_FOLDER" ]; then
mkdir -p "$DEST_FOLDER"
fi
# 使用find命令递归地查找所有.cpp文件,并使用cp命令将它们拷贝到目标文件夹
find . -type f -name "*.cpp" -exec cp --parents \{} $DEST_FOLDER \;
echo "All .cpp files have been copied to $DEST_FOLDER."
要运行这个脚本,请遵循下面的步骤:
-
将上面的代码保存到一个文件中,比如叫做
copy_cpp_files.sh
。 -
打开终端,导航到保存该脚本的文件夹。
-
使用
chmod
命令给脚本添加执行权限:chmod +x copy_cpp_files.sh
-
执行脚本:
./copy_cpp_files.sh
这样,脚本会把当前文件夹以及所有子文件夹下的.cpp
文件拷贝到/home/majn/llvm_project/llvm_cpp_test_suite
目录下。
Note: 这个脚本使用了
cp --parents
命令,这意味着源文件的目录结构也会被复制到目标文件夹中。如果你不希望这样,你可以删除--parents
选项。然而,如果有重名文件,这可能会导致问题。请谨慎操作,并在运行脚本之前做好备份。
【注1】:在 Bash 脚本中,-d
是一个单目运算符,用于检查指定的路径是否是一个目录。当你在条件表达式中使用 -d
,如 [ -d "$DEST_FOLDER" ]
,这将会检查 $DEST_FOLDER
是否是一个存在的目录。
如果 $DEST_FOLDER
是一个目录,那么该条件表达式 [ -d "$DEST_FOLDER" ]
的返回值为真(0)。如果不是一个目录或该路径不存在,那么返回值为假(非 0 值)。
因此,在 [ ! -d "$DEST_FOLDER" ]
表达式中,!
符号用于逆转 -d
的结果。所以这个整体表达式会检查 $DEST_FOLDER
是否不是一个目录。如果 $DEST_FOLDER
不是一个目录或该路径不存在,这个表达式将返回真。这通常用于确定是否需要创建一个新的目录。
【注2】:这个命令使用 find
工具在当前目录(表示为.
)和其所有子目录中递归地查找文件。找到的文件必须满足两个条件:
- 它们是文件(
-type f
)。 - 它们的文件名以
.cpp
结尾(-name "*.cpp"
)。
对于满足这些条件的每个文件,find
会执行 cp --parents \{} $DEST_FOLDER
命令。这个命令会将找到的文件复制到 $DEST_FOLDER
指定的目录。
下面是命令各部分的详细解释:
find .
:从当前目录开始搜索。-type f
:仅查找文件(不包括目录、链接等)。-name "*.cpp"
:只有文件名匹配这个模式的文件会被选中。这里,选中的文件是所有以.cpp
结尾的文件。-exec
:对每个找到的文件执行后面跟着的命令。
接下来是 -exec
参数后面的命令:
-
cp --parents \{} $DEST_FOLDER
:这是cp
命令,用于复制文件。--parents
:这个选项会保留源文件的目录结构。例如,如果源文件在subdir/myfile.cpp
,cp --parents
会在$DEST_FOLDER
中创建一个名为subdir
的子目录(如果尚不存在),然后将myfile.cpp
复制到那里。\{}
:这是一个占位符,代表find
命令找到的每个文件。$DEST_FOLDER
:这是目标目录,所有找到的.cpp
文件都会被复制到这里。
-
\;
:标记-exec
参数的结束。
综上所述,这个命令会找到当前目录和所有子目录下的 .cpp
文件,并保留它们的目录结构,复制到 $DEST_FOLDER
指定的目录中。