How to "clone" a directory and it's symlink?


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers How to "clone" a directory and it's symlink?
# 1  
Old 08-10-2012
How to "clone" a directory and it's symlink?

Hi all,

Am trying to make a backup of a directory to move it to a new directory 'coz I need to do a re-install of a software.

On Linux, I can do cp -rpH but not on Solaris?

Example is as below:

ls -l dir1
total 0
-rw-r----- 1 oracle dba 0 Aug 9 13:08 fil3.txt
lrwxrwxrwx 1 oracle dba 9 Aug 9 13:11 file1 -> file1.txt
-rw-r----- 1 oracle dba 0 Aug 9 13:08 file1.txt
-rw-r----- 1 oracle dba 0 Aug 9 13:08 file2.txt

I want to make a copy of this directory as dir2 with the symlinks as they are.

Any advise much appreciated. Thanks in advance.


# 2  
Old 08-10-2012
What Solaris version do you use? On Solaris 10, cp -rpH should work.
# 3  
Old 08-10-2012
Try with rsync. To have dir2 as an exact copy of dir1:

Code:
rsync -avHPAX --delete /dir1/ /dir2

I use it in Linux, but AFAIK it should be the same in Solaris.
--
Bye
# 4  
Old 08-10-2012
You can also use the cpio command in conjunction with find. This keeps the perms, time stamps, owners/group, links, etc. This option is independent of OS distro and/or version.

Begin by placing yourself in the directory you want 'cloned'.

Code:
cd /path/to/your/dir

Issue the find command for this directory and pipe that to cpio and specify the new path.

The options to cpio are
Quote:
pmuldv
- these are what I use.

Code:
find . -depth | cpio -pmuldv /path/to/new/directory

Notice the find command is using the PATH of
Quote:
.
(the 'dot' character) for its search path. You could use an absolute path in your find command but then you recreate that path in the new location as well. Not a bad thing in itself but it can be extra work if you need to restore.

Code:
The cpio options: p     pass through mode
                                            there are 3 modes; in, out, pass through
                                  m   preserve modification times
                                  u    unconditional
                                   l     link files instead of copying, when possible
                                  d    create directories as needed
                                  v    verbode

On a Linux system you can do
Quote:
info cpio
and see these options and more.
This User Gave Thanks to raggmopp For This Post:
# 5  
Old 08-10-2012
Quote:
Originally Posted by raggmopp
You can also use the cpio command in conjunction with find. This keeps the perms, time stamps, owners/group, links, etc. This option is independent of OS distro and/or version.
There is no guarantee that everything (uid/gid ownership in particular) will be preserved unless the command is run as root.

Quote:
Originally Posted by raggmopp
Issue the find command for this directory and pipe that to cpio and specify the new path.

Code:
find . -depth | cpio -pmuldv /path/to/new/directory

Notice the find command is using the PATH of (the 'dot' character) for its search path. You could use an absolute path in your find command but then you recreate that path in the new location as well. Not a bad thing in itself but it can be extra work if you need to restore.

Code:
The cpio options: p     pass through mode
                                            there are 3 modes; in, out, pass through
                                  m   preserve modification times
                                  u    unconditional
                                   l     link files instead of copying, when possible
                                  d    create directories as needed
                                  v    verbode

If available, pax is a much better tool for this task than cpio.

With pax:

* there's no need for a depth-first find traversal and no need to name each file explicitly. Unlike cpio which treats a directory like a regular file, pax (like tar) implicitly includes the hierarchy below a directory.

* there's no need to fuss over relative or absolute pathnames.

* most of the options required by cpio are not necessary. pax's default behavior in copy mode will preserve timestamps, use hardlinks where possible, and create directories as needed.

Code:
pax -rw oldir newdir

If the copying will be performed as root and all ownership and permissions should be preserved exactly, add -p e.

pax should be available on any UNIX system (GNU's Not UNIX Smilie).

Regards,
Alister

Last edited by alister; 08-10-2012 at 11:42 AM..
# 6  
Old 08-10-2012
True, pax SHOULD be available. But sometimes it is not.
I think some distros install by default and some don't. With cpio it is always installed by default.

I have been using pax for years on HPUX. But I wanted to provide a solution that I know did not require any additional downloads/installs. As stated, cpio has always been there.
# 7  
Old 08-10-2012
Quote:
Originally Posted by raggmopp
True, pax SHOULD be available. But sometimes it is not.
I think some distros install by default and some don't. With cpio it is always installed by default.
I've seen lots of things where CPIO isn't installed by default.

CPIO isn't even the standard anymore. Basically -- tar won. It got standardized and modernized in POSIX. cpio didn't.
 
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. AIX

Apache 2.4 directory cannot display "Last modified" "Size" "Description"

Hi 2 all, i have had AIX 7.2 :/# /usr/IBMAHS/bin/apachectl -v Server version: Apache/2.4.12 (Unix) Server built: May 25 2015 04:58:27 :/#:/# /usr/IBMAHS/bin/apachectl -M Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_worker_module (static) ... (3 Replies)
Discussion started by: penchev
3 Replies

2. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

3. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

4. Solaris

Repeated error - "se_hdlc: clone device must be attached before use" in /var/adm/messages

Below is the error being repeated on my Solaris 9 Sun-Fire-V890 machine. SAN team confirmed as everything is fine from their end. I did google and found that some people say its a known Oracle bug when you have Oracle 10G installed on your system but I kind of disagree with them. Please see below... (2 Replies)
Discussion started by: vikkash
2 Replies

5. Shell Programming and Scripting

"find . -printf" without prepended "." path? Getting path to current working directory?

If I enter (simplified): find . -printf "%p\n" then all files in the output are prepended by a "." like ./local/share/test23.log How can achieve that a.) the leading "./" is omitted and/or b.) the full path to the current directory is inserted (enclosed by brackets and a blank)... (1 Reply)
Discussion started by: pstein
1 Replies

6. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

7. Shell Programming and Scripting

Delete files older than "x" if directory size is greater than "y"

I wrote a script to delete files which are older than "x" days, if the size of the directory is greater than "y" #!/bin/bash du -hs $1 while read SIZE ENTRY do if ; then find $1 -mtime +$2 -exec rm -f {} \; echo "Files older than $2 days deleted" else echo "free Space available"... (4 Replies)
Discussion started by: JamesCarter
4 Replies

8. Shell Programming and Scripting

cat $como_file | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g'

hi All, cat file_name | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g' Can this be done by using sed or awk alone (4 Replies)
Discussion started by: harshakusam
4 Replies

9. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies
Login or Register to Ask a Question