rsync -В чем разница между использованием *и **в директиве exclude?

Порт не нужен.

См.https://firewalld.org/documentation/howto/open-a-port-or-service.html

For most of the more important services there is already a service defined in firewalld. Then there is no need to know about the default port number(s).

1
10.01.2021, 02:29
2 ответа

Давайте добавим несколько каталогов и файлов в BackupOfSettingsдля проверки установки:

mkdir -p "$openWrtPath"/BackupOfSettings/sub1/sub2
touch "$openWrtPath"/BackupOfSettings/file1.tar.gz
touch "$openWrtPath"/BackupOfSettings/sub1/file2.tar.gz
touch "$openWrtPath"/BackupOfSettings/sub1/sub2/file3.tar.gz

И мы также добавляем подкаталоги sub1и sub1/sub2как включаемые в команду:

rsync -vvritn \
  --include='BackupOfSettings/' \
  --include='BackupOfSettings/sub1/' \
  --include='BackupOfSettings/sub1/sub2/' \
  --include='BackupOfSettings/*.tar.gz' \
  --exclude='*' "$openWrtPath" "$ncpPath"

Это синхронизирует BackupOfSettings/file1.tar.gz, BackupOfSettings/sub1/и BackupOfSettings/sub1/sub2/, но не какие-либо файлы внутри подкаталогов, поскольку *не соответствует /.


Теперь давайте попробуем BackupOfSettings/**.tar.gzвключить:

rsync -vvritn \
  --include='BackupOfSettings/' \
  --include='BackupOfSettings/sub1/' \
  --include='BackupOfSettings/sub1/sub2/' \
  --include='BackupOfSettings/**.tar.gz' \
  --exclude='*' "$openWrtPath" "$ncpPath"

Сюда входят все три файла *.tar.gz. **похож на *, но также соответствует разделителю каталогов/(из sub1/иsub1/sub2/).

Отображение **как исключения (, как в заголовке вопроса ), немного сложно, потому что --exclude='*'исключает первый уровень ниже "$openWrtPath", что также означает, что любые подкаталоги и файлы уже исключены. (, так как родительский каталог на уровне 1 исключен ). Использование **ничего не изменит.


Чтобы включить каталог BackupOfSettingsи любые подкаталоги ниже этого каталога, вы можете заменить указанные выше три каталога на

--include='BackupOfSettings/' \
--include='BackupOfSettings/**/' \

или

--include='BackupOfSettings/***/' \

Изman rsync:

[...]
o      a ’*’ matches any path component, but it stops at slashes.

o      use ’**’ to match anything, including slashes.

[...]

o      if the pattern contains a / (not counting a trailing /) or a "**", then it
       is  matched  against the full pathname, including any leading directories.
       If the pattern doesn’t contain a / or a "**",  then  it  is  matched  only
       against the final component of the filename.  (Remember that the algorithm
       is applied recursively so "full filename" can actually be any portion of a
       path from the starting directory on down.)

o      a trailing "dir_name/***" will match both the directory (as if "dir_name/"
       had been specified) and everything in the directory (as  if  "dir_name/**"
       had been specified).  This behavior was added in version 2.6.7.
[...]
1
18.03.2021, 22:37

Двойная звездочка может интерпретироваться оболочкой как специальный подстановочный символ. См. такжеman bash:

globstar
    If set, the pattern ** used in a pathname expansion context will match 
    all files and zero or more directories and subdirectories.  
    If the pattern is followed by  a  /, only directories and subdirectories match.
-1
18.03.2021, 22:37

Теги

Похожие вопросы