次の構造のテストフォルダがあります。
"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
これによりエラーが発生し、完了しません。
問題は、「bar - foo」フォルダがコピーされないことです。エラーを見ると、問題の1つは、ls -F
ファイル名とフォルダのエスケープされていない出力を提供することです。
:driveA$ ls -F
bar - foo/
fileA
fileB
fileC
folder.A/
folderB/
エスケープ文字を出力するオプションが見つからなかったので、ls
次に試すのは後処理です。sed
1つの方法はエスケープ文字を追加することです。
: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]
これまで混乱しています。ハイフンのために窒息せずにコンテンツを提供する方法はありますかrsync
?ls
答え1
Rsyncにはexclude
オプションがあります。これにより、これを達成できるはずです。
cd /path/to/driveA
rsync -avWxP --exclude=folder.A . /path/to/driveB/