在 Linux Bash 中复制具有完整路径的文件和文件夹

在 Linux Bash 中复制具有完整路径的文件和文件夹

我正在尝试制作一个简单的脚本,该脚本获取文件或文件夹路径并将其复制并保留完整路径,放在system脚本旁边的文件夹中。

例如: 想象一下我的系统中只有这个文件夹:

/home/my_user/copy_script
/home/my_user/folder1/file1
/home/my_user/folder1/file2
/home/my_user/file3

如果我将路径作为参数传递/home/my_user/folder1,并且/home/my_user/file3我希望获得此文件夹结构作为输出:

文件运行脚本

/home/my_user/copy_script
/home/my_user/folder1/file1
/home/my_user/folder1/file2
/home/my_user/file3

新文件创建自/home/my_user/folder1小路

/home/my_user/system/home/my_user/folder1/file1
/home/my_user/system/home/my_user/folder1/file2

新文件创建自/home/my_user/file3小路

/home/my_user/system/home/my_user/file3

我的想法是将配置文件的副本放在一个文件夹中,该文件夹将与 gitlab 同步,并保留与我的系统相同的结构。

我的脚本到现在看起来是这样的:

#!/bin/bash

#need to implement relative paths
#https://stackoverflow.com/questions/3963716/how-to-manually-expand-a- 
special-variable-ex-tilde-in-bash/29310477#29310477

#clears the old folder
rm -r ./system

#goes through all the arguments
for var in "$@"
do
    #It is a folder
    if [[ -d $var ]]; then
        mkdir -p "$PWD/system/$var"
        cp -R $var "$PWD/system/$var/.."
        echo "$var FOLDER"
    #It is a file
    elif [[ -f $var ]]; then
        mkdir -p "$PWD/system/$var"
        cp -R $var "$PWD/system/$var/.."
        echo "$var FILE"
    #The path is not ok
    else
        echo "$var ERROR"
    fi
done

当它是一个文件夹时我认为它工作正常:

例子:

使用与调用时相同的文件夹结构copy_script /home/my_user/folder1

首先创建/home/my_user/system/home/my_user/folder1路径

然后复制folder1/home/my_user/system/home/my_user/

但是对于文件来说,这不起作用,因为它创建了我不需要的文件夹,而且我无法复制这些文件。

例子:

调用copy_script /home/my_user/file3将创建/home/my_user/system/home/my_user/file3路径,但是我无法创建文件,因为有一个同名的文件夹。

有人能帮我解释一下怎么做吗?谢谢。

答案1

正如 l0b0 提到的,它可以与 rsync 一起使用:

$ tree srcDir
srcDir
├── aa
│   └── aaa.txt
├── bb
│   ├── bb.txt
│   └── ccc
│       └── cccc.txt
└── ss

之后:

rsync -r srcDir newDir

看起来像:

$ tree newDir
newDir
└── srcDir
    ├── aa
    │   └── aaa.txt
    ├── bb
    │   ├── bb.txt
    │   └── ccc
    │       └── cccc.txt
    └── ss

但是之后:

rsync -r srcDir/ newDir

看起来像:

$ tree newDir
newDir
├── aa
│   └── aaa.txt
├── bb
│   ├── bb.txt
│   └── ccc
│       └── cccc.txt
└── ss

关于软链接和硬链接,还有许多其他 rsync 选项。

相关内容