I am trying to create a directory that will house all and only my
PDFs compiled from LaTeX. I like keeping each project in a separate
folder, all housed in a big folder called
I'm, using zsh. I tried doing the same thing in bash and even with the filter that listed every single file in every subdirectory... What's going on here?
Why isn't rsync understanding my pdf only filter?
ANSWER:-
LaTeX
. So I tried running:rsync -avn *.pdf ~/LaTeX/ ~/Output/
which should find all the pdfs in ~/LaTeX/
and transfer them to the output folder. This doesn't work. It tells me it's found no matches for "*.pdf
".
If I leave out this filter, the command lists all the files in all the
project folders under LaTeX. So it's a problem with the *.pdf filter. I
tried replacing ~/
with the full path to my home directory, but that didn't have an effect.I'm, using zsh. I tried doing the same thing in bash and even with the filter that listed every single file in every subdirectory... What's going on here?
Why isn't rsync understanding my pdf only filter?
ANSWER:-
Rsync's filter rules can seem daunting when you read the
manual, but there are a few simple principles that suffice in many
cases:
Thus here we need to include
- Inclusions and exclusions:
- Excluding files by name or by location is easy:
--exclude=*~
,--exclude=/some/relative/location
. - If you only want to match a few files or locations, include them, include every directory leading to them (for example with
--include=*/
), then exclude the rest with--exclude='*'
. This is because: - If you exclude a directory, this excludes everything below it.
- If you include a directory, this doesn't automatically include its contents. In recent versions,
--include='directory/***'
will do that. - For each file, the first matching rule applies (and anything never matched is included).
- Excluding files by name or by location is easy:
- Patterns:
- If a pattern doesn't contain a
/
, it applies to the file name sans directory. - If a pattern ends with
/
, it applies to directories only. - If a pattern starts with
/
, it applies to the whole path from the directory that was passed as an argument torsync
. *
any substring of a single directory component (i.e. never matches/
);**
matches any path substring.
- If a pattern doesn't contain a
- If a source argument ends with a
/
, its contents are copied (rsync -r a/ b
createsb/foo
for everya/foo
). Otherwise the directory itself is copied (rsync -r a b
createsb/a
).
Thus here we need to include
*.pdf
, include directories containing them, and exclude everything else.rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Note that this copies all directories, even the ones that contain no
matching file or subdirectory containing one. This can be avoided with
the --prune-empty-dirs
option (it's not a universal
solution since you then can't copy a directory even by matching it
explicitly, but that's a rare requirement).rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
0 comments:
Post a Comment
Don't Forget to comment