使用mac终端将某个文件夹复制到指下目录中所有的文件中的命令

6个月前 / Directory:MAC / Views:247

假设问题:

mac系统中如何用终端命令把/Users/pic/Documents/key 目录中文件夹和文件夹下的文件,拷贝到/Users/pic/Desktop/file目录下所有的文件夹中

file目录下有很多文件夹,将key文件夹和其中的内容复制过来,保证file目录下所有文件夹中都要包含key这个文件夹


解决办法:

为了完成这个任务,你可以使用一个简单的bash脚本或命令行指令来遍历/Users/pic/Desktop/file目录下的每一个子目录,并将/Users/pic/Documents/key复制到每个子目录中。这里有一个可以实现该功能的命令:

for d in /Users/pic/Desktop/file/*/; do cp -R /Users/pic/Documents/key "$d"; done

*命令中的pic是你的电脑用户名称,请改成你自己的。假如你不知道文件目录地址,可以打开终端,将文件夹拖到终端中,即可得到目录地址。

解释一下这条命令的工作原理:

for d in /Users/pic/Desktop/file/*/;:这会遍历file目录中的每一个子目录(注意最后的斜杠/表示只匹配目录)。

do cp -R /Users/pic/Documents/key "$d";:对于每个子目录,它会执行cp -R命令,递归地复制整个key文件夹及其内容到当前的子目录$d中。

done:结束循环。


请确保在运行此命令之前打开终端并检查路径是否正确。

请注意,上述命令假设你想要覆盖已经存在于file子目录中的任何名为key的现有文件夹。如果你想跳过已经存在的key文件夹而不覆盖它们,或者想对可能的覆盖行为进行更精细的控制,那么你可能需要编写一个稍微复杂一点的脚本来处理这些情况。


如果遇到同名文件夹,不想覆盖,将key改名为texture

为了实现当遇到同名文件夹时不覆盖,并且将要复制的文件夹名称从key改为Texture,你可以使用一个稍微复杂一点的bash脚本。这个脚本会检查目标目录中是否已经存在名为key的文件夹;如果存在,则复制时将源文件夹重命名为Texture。

下面是一个可以完成此任务的命令:

#!/bin/bash
SOURCE_DIR="/Users/pic/Documents/key"
TARGET_PARENT="/Users/pic/Desktop/file"
for d in "$TARGET_PARENT"/*/; do
    TARGET_SUBDIR="$d$(basename "$SOURCE_DIR")"
    if [ -d "$TARGET_SUBDIR" ]; then
        echo "Directory $TARGET_SUBDIR exists, renaming to Texture."
        cp -R "$SOURCE_DIR" "$dTexture"
    else
        cp -R "$SOURCE_DIR" "$d"
    fi
done

*命令中的pic是你的电脑用户名称,请改成你自己的。假如你不知道文件目录地址,可以打开终端,将文件夹拖到终端中,即可得到目录地址。


解释一下这段脚本的工作原理:

SOURCE_DIR 和 TARGET_PARENT 变量分别存储了源文件夹和目标父目录的路径。

for d in "$TARGET_PARENT"/*/; do ... done:遍历file目录中的每一个子目录。

TARGET_SUBDIR="$d$(basename "$SOURCE_DIR")":构建出目标子目录的完整路径。

if [ -d "$TARGET_SUBDIR" ]; then ... fi:检查目标子目录中是否已存在名为key的文件夹。

如果存在(即条件为真),则执行cp -R "$SOURCE_DIR" "$dTexture",这会将源文件夹复制到目标子目录并命名为Texture。

如果不存在(即条件为假),则直接复制源文件夹到目标子目录,保持原名key。