1

I was traying to make a simple script that takes a file or folder path and copies it, preserving the full path, in a folder called system next to the script.

Exaple: Imagine I just have this folders in my system:

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

If I pass as arguments the paths /home/my_user/folder1 and /home/my_user/file3 I want to get this folder structure as output:

Files before runing the script

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

New files created from /home/my_user/folder1 path

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

New files created from /home/my_user/file3 path

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

The idea to have a copy of the config files in a folder that will be sync with gitlab preserving the same structure as my system.

My script till now looks like this:

#!/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

When it is a folder i think it works fine:

Example:

With the same folder structure as the beggining when we call copy_script /home/my_user/folder1

First creates the /home/my_user/system/home/my_user/folder1 path

Then copies folder1 in /home/my_user/system/home/my_user/

But with files this does not work because it creates folders that I do not need and the I can't copy the files.

Example:

calling copy_script /home/my_user/file3 will create /home/my_user/system/home/my_user/file3 path but then I can't create the file because there is a folder with the same name.

Could someone kindly explain me how to do this? Thanks.

2
  • 1
    Have you tried rsync -r . target_folder/?
    – l0b0
    Aug 27, 2018 at 9:58
  • I did not know the existence of that tool, thanks, that's the answer I was looking for.
    – edoelas
    Aug 27, 2018 at 10:14

1 Answer 1

0

As l0b0 mentioned it works with rsync:

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

and after:

rsync -r srcDir newDir

it looks like:

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

but after:

rsync -r srcDir/ newDir

it looks like:

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

There is a lot of other rsync options regarding soft and hard links.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .