24

I'm trying to set up an rsync that excludes all .* files except for .htaccess but unfortunately, this doesn't work:

rsync -avP --exclude=".*" --include="./.htaccess" ./. user@server:/dir

Is it possible to somehow exclude general exclude rules?

Rich
  • 445
  • 1
  • 3
  • 7

1 Answers1

39

The first matching rule applies, so include .htaccess before excluding .*.

rsync -avP --include=".htaccess" --exclude=".*" . user@server:/dir

This copies .htaccess at every level. I don't know what you intended with ./.htaccess; if you want to match a file at the root of the copy only, start the pattern with a /. If you only want the root .htaccess, you can't just use --include='/.htaccess' --exclude='.*', because the non-rooted rule actually takes precedence here, you need to do something more complicated:

rsync -avP --exclude='/*/**/.htaccess' --include='.htaccess' --exclude=".*" . user@server:/dir

Further reading: basic principles for rsync filters.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
  • @fred.bear: That one was a genuine typo, and a nasty one. Thanks for spotting it! – Gilles 'SO- stop being evil' Apr 11 '11 at 12:22
  • Thanks, I had tried putting the `--include` first, but the "./" in front of the "./.htaccess" was what was killing it. – Rich Apr 11 '11 at 18:26
  • 1
    @Rich note that if there are hidden directories that contain a `.htaccess` file, you'll have to `--include='.*/'` (I think) before the final `--exclude`, see also [here](http://unix.stackexchange.com/a/2503/863) – Tobias Kienzler Nov 19 '12 at 14:47
  • Any idea why `rsync -avP --exclude=/.htaccess src/dir/ dst/dir/` works as expected (excludes `.htaccess` only at the root directory), but `rsync -avP --exclude=/.htaccess src/dir dst` doesn't (it fails to exclude even at the root)? – haridsv Mar 02 '21 at 13:53
  • 1
    @haridsv In the first case, the root is `src/dir` and you're copying the root, so `src/dir/.htaccess` is excluded. In the second case, the root is `src` and you're copying `dir`, so `src/.htaccess` is excluded. – Gilles 'SO- stop being evil' Mar 02 '21 at 14:22
  • You are right! This works: `rsync -avP --exclude=/dir/.htaccess src/dir dst` – haridsv Mar 03 '21 at 07:36