Rsyncディレクトリはファイルをフィルタリングし、エッジケース(たとえば、ハイフン(-)名)を保存します。

Rsyncディレクトリはファイルをフィルタリングし、エッジケース(たとえば、ハイフン(-)名)を保存します。

次の構造のテストフォルダがあります。

"driveA"
  - "bar - foo"
    - "fileBarFooA"
    - "fileBarFooB"
  - "fileA"
  - "fileB"
  - "fileC"
  - "folder.A"
    - "fileAA"
    - "fileAB"
  - "folderB"
    - "fileBA"
    - "fileBB"

Bashシェルでは、Aドライブの内容をBドライブ(「folder.A」フォルダを除く)に同期して、次のような結果のコピーを取得しようとしています。

"driveB"
  - "bar - foo"
    - "fileBarFooA"
    - "fileBarFooB"
  - "fileA"
  - "fileB"
  - "fileC"
  - "folderB"
    - "fileBA"
    - "fileBB"

一見すると、これを達成する1つの方法は、フィルタリングされたlsをDriveAのrsyncの引数として提供することです。

rsync -aR -- `ls -F | grep [^folder.A/]` ../driveB

これによりエラーが発生し、完了しません。

rsyncをフィルタリングする最初の方法は間違っています。

問題は、「bar - foo」フォルダがコピーされないことです。エラーを見ると、問題の1つは、ls -Fファイル名とフォルダのエスケープされていない出力を提供することです。

:driveA$ ls -F
bar - foo/  
fileA       
fileB       
fileC
folder.A/
folderB/

エスケープ文字を出力するオプションが見つからなかったので、ls次に試すのは後処理です。sed1つの方法はエスケープ文字を追加することです。

:driveA vgani$ ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]
bar\ -\ foo/
fileA
fileB
fileC
folderB/

これと並行して、次のように与えられる。

:driveA $ rsync -aR `ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]` ../driveB
rsync: -\: unknown option
rsync error: syntax or usage error (code 1) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(1337) [client=2.6.9]

-\ああ、バグです(そして1337バグもあります!)これはrsyncがフォルダの一部をコマンドライン引数として使用するため、次のように追加することで解決できます--

driveA $ rsync -aR -- `ls -F | sed 's/\ /\\\ /g' | grep [^folder.A/]` ../driveB

ここに画像の説明を入力してください。

したがって、エスケープ文字を追加しなくても結果と同じように見えます。

別の後処理のアイデアは、引用符を追加することです。

:driveA $ ls -F | sed 's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g'
"bar - foo"/
"file"
"file"
"file"
"folder.A"/
"folderB"/

ただし、これにより、rsyncは引用符をリテラル文字として扱い、何もコピーしません。

:driveA $ rsync -aR -- `ls -F | sed 's/^/"/g' | sed 's/[^/]$/"/g' | sed 's/\//"\//g' | grep [^\"folder.A\"/]` ../driveB
rsync: link_stat "/driveA/"bar" failed: No such file or directory (2)
rsync: link_stat "/driveA/-" failed: No such file or directory (2)
rsync: link_stat "/driveA/foo"/" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"file"" failed: No such file or directory (2)
rsync: link_stat "/driveA/"folderB"/" failed: No such file or directory (2)
rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-51/rsync/main.c(996) [sender=2.6.9]

これまで混乱しています。ハイフンのために窒息せずにコンテンツを提供する方法はありますかrsyncls

答え1

Rsyncにはexcludeオプションがあります。これにより、これを達成できるはずです。

cd /path/to/driveA
rsync -avWxP --exclude=folder.A . /path/to/driveB/

関連情報