44

I back up my files using rsync. Right after a sync, I ran it expecting to see nothing, but instead it looked like it was skipping directories. I've (obviously) changed names, but I believe I've still captured all the information I could. What's happening here?

$ ls -l /source/backup/myfiles
drwxr-xr-x 2 me me  4096 2010-10-03 14:00 foo
drwxr-xr-x 2 me me  4096 2011-08-03 23:49 bar
drwxr-xr-x 2 me me  4096 2011-08-18 18:58 baz

$ ls -l /destination/backup/myfiles
drwxr-xr-x 2 me me  4096 2010-10-03 14:00 foo
drwxr-xr-x 2 me me  4096 2011-08-03 23:49 bar
drwxr-xr-x 2 me me  4096 2011-08-18 18:58 baz

$ file /source/backup/myfiles/foo
/source/backup/myfiles/foo/: directory

Then I sync (expecting no changes):

$ rsync -rtvp /source/backup /destination
sending incremental file list
backup/myfiles
skipping non-regular file "backup/myfiles/foo"
skipping non-regular file "backup/myfiles/bar"

And here's the weird part:

$ echo 'hi' > /source/backup/myfiles/foo/test
$ rsync -rtvp /source/backup /destination
sending incremental file list
backup/myfiles
backup/myfiles/foo
backup/myfiles/foo/test
skipping non-regular file "backup/myfiles/foo"
skipping non-regular file "backup/myfiles/bar"

So it worked:

$ ls -l /source/backup/myfiles/foo
-rw-r--r-- 1 me me  3126091 2010-06-15 22:22 IMGP1856.JPG
-rw-r--r-- 1 me me  3473038 2010-06-15 22:30 P1010615.JPG
-rw-r--r-- 1 me me        3 2011-08-24 13:53 test

$ ls -l /destination/backup/myfiles/foo
-rw-r--r-- 1 me me  3126091 2010-06-15 22:22 IMGP1856.JPG
-rw-r--r-- 1 me me  3473038 2010-06-15 22:30 P1010615.JPG
-rw-r--r-- 1 me me        3 2011-08-24 13:53 test

but still:

$ rsync -rtvp /source/backup /destination
sending incremental file list
backup/myfiles
skipping non-regular file "backup/myfiles/foo"
skipping non-regular file "backup/myfiles/bar"

Other notes:

My actual directories "foo" and "bar" do have spaces, but no other strange characters. Other directories have spaces and have no problem. I 'stat'-ed and saw no differences between the directories that don't rsync and the ones that do.

If you need more information, just ask.

Luke Girvin
  • 13,221
  • 9
  • 64
  • 84
Richard
  • 441
  • 1
  • 4
  • 4

6 Answers6

64

Are you absolutely sure those individual files are not symbolic links?

Rsync has a few useful flags such as -l which will "copy symlinks as symlinks". Adding -l to your command:

rsync -rtvpl /source/backup /destination

I believe symlinks are skipped by default because they can be a security risk. Check the man page or --help for more info on this:

rsync --help | grep link

To verify these are symbolic links or pro-actively to find symbolic links you can use file or find:

$ file /path/to/file
/path/to/file: symbolic link to `/path/file`
$ find /path -type l
/path/to/file
zaTricky
  • 1,838
  • 17
  • 22
  • 8
    Yet another example of a poorly worded status/error message. If your code is skipping the file because it is a symlink, then why not print "skipping symlink"? – bsd Aug 26 '17 at 11:22
  • 1
    My guess is that rsync is older than symlinks. Maybe they just haven't bothered to add it since it is such a rare use-case. Nothing stopping you from contributing: https://rsync.samba.org/bugzilla.html – zaTricky Aug 26 '17 at 13:46
6

Are you absolutely sure that it's not a symbolic link directory?

try a:

file /source/backup/myfiles/foo

to make sure it's a directory

Also, it could very well be a loopback mount try

mount

and make sure that /source/backup/myfiles/foo is not listed.

Gauthic
  • 91
  • 1
  • 3
  • `$ file /source/backup/myfiles/foo` `/source/backup/myfiles/foo/: directory` and 'mount' shows the filesystems that /source and /destination are on, but no 'lower' than that. – Richard Aug 24 '11 at 19:33
2

You should try the below command, most probably it will work for you:

rsync -ravz /source/backup /destination
mSatyam
  • 531
  • 7
  • 25
0

You can try the following, it will work

rsync -rtvp /source/backup /destination
SeniorJD
  • 6,946
  • 4
  • 36
  • 53
Premjith
  • 19
  • 3
0

I personally always use this syntax in my script and works a treat to backup the entire system (skipping sys/* & proc/* nfs4/*)

sudo rsync --delete --stats  --exclude-from $EXCLUDE -rlptgoDv / $TARGET/ | tee -a $LOG

Here is my script run by root's cron daily:

#!/bin/bash
#
NFS="/nfs4"
HOSTNAME=`hostname`
TIMESTAMP=`date "+%Y%m%d_%H%M%S"`
EXCLUDE="/home/gcclinux/Backups/root-rsync.excludes"
TARGET="${NFS}/${HOSTNAME}/SYS"
LOGDIR="${NFS}/${HOSTNAME}/SYS-LOG"
CMD=`/usr/bin/stat -f -L -c %T ${NFS}`

## CHECK IF NFS IS MOUNTED...

if [[ ! $CMD == "nfs" ]];then
    echo "NFS NOT MOUNTED"
    exit 1
fi

## CHECK IF LOG DIRECTORY EXIST

if [ ! -d "$LOGDIR" ]; then
    /bin/mkdir -p $LOGDIR
fi

## CREATE LOG HEADER
LOG=$LOGDIR/"rsync_result."$TIMESTAMP".txt"

echo "-------------------------------------------------------" | tee -a $LOG
echo `date` | tee -a $LOG
echo "" | tee -a $LOG

## START RUNNING BACKUP
/usr/bin/rsync --delete --stats  --exclude-from $EXCLUDE -rlptgoDv / $TARGET/ | tee -a $LOG
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
0

In some cases just copy file to another location (like home) then try again