在這裏你去:
find ./build/.jenkins/jobs/* |
grep -i 'someotherfiles.blah' |
cut -d/-f 5- |
rsync -v -r --exclude-from=- ./build/.jenkins/jobs/ ./output
步驟,這是發生了什麼事:
find ./build/.jenkins/jobs/*
這提供了在指定的路徑的目錄/文件列表。它的輸出是
./build/.jenkins/jobs/Job1
./build/.jenkins/jobs/Job1/config.xml
./build/.jenkins/jobs/Job1/someotherfiles.blah
./build/.jenkins/jobs/Job2
./build/.jenkins/jobs/Job2/config.xml
./build/.jenkins/jobs/Job2/someotherfiles.blah
./build/.jenkins/jobs/Job3
./build/.jenkins/jobs/Job3/config.xml
./build/.jenkins/jobs/Job3/someotherfiles.blah
然後,我們將其管理到grep命令,在那裏我們可以放入任何我們想要過濾的模式。在我的例子,我grepping排除someotherfiles.blah
find ./build/.jenkins/jobs/* |
grep -i 'someotherfiles.blah'
輸出
./build/.jenkins/jobs/Job1/someotherfiles.blah
./build/.jenkins/jobs/Job2/someotherfiles.blah
./build/.jenkins/jobs/Job3/someotherfiles.blah
現在的rsync將採取從標準的模式列表從其同步排除。它需要具有與其src參數相關的路徑,所以我們從out列表中刪除了前幾個目錄。
find ./build/.jenkins/jobs/* |
grep -i 'someotherfiles.blah' |
cut -d/-f 5-
輸出:
Job1/someotherfiles.blah
Job2/someotherfiles.blah
Job3/someotherfiles.blah
現在,我們管這給它rsync的使用--exclude-從= - 的說法。這將告訴它從stdin中排除文件。
find ./build/.jenkins/jobs/* |
grep -i 'someotherfiles.blah' |
cut -d/-f 5- |
rsync -v -r --exclude-from=- ./build/.jenkins/jobs/ ./output
building file list ... done
Job1/
Job1/config.xml
Job2/
Job2/config.xml
Job3/
Job3/config.xml
sent 318 bytes received 104 bytes 844.00 bytes/sec
total size is 15 speedup is 0.04
該解決方案是使用grep來查找文件的列表從rsync將排除輸出。你可能希望grep表達式只包含某些文件。您也可以使用--include-from = - 參數來執行此操作。還有一個變化。下面是這個完整的代碼,其中僅複製的config.xml文件
find ./build/.jenkins/jobs/ |
grep -i 'config.xml' |
cut -d/-f 5- |
awk -F/ '{print; while(/\//) {sub("/[^/]*", ""); print}}'|
rsync -v -r --include-from=- --exclude='*' ./build/.jenkins/jobs/ ./output
當你添加的東西到--exclude列表,rsync的將不會搜索列表中的所有子目錄。顯然,我們不需要這樣,因爲我們在Job1,2,3文件夾中有config.xml文件!所以我們使用awk將我們想要搜索config.xml文件的父目錄添加到我們的輸出中。
之後,我們讓rsync --include-從我們的標準輸入,並排除其他一切(「*」)
以上使用相對路徑的路徑,如果你使用絕對路徑,根據需要修改路徑和確保cut命令中的-f參數選擇正確的標記號碼以切入。
反正,將這些命令保存在一個.sh文件中,你應該有一個方便的小工具來使用。
我更新了我的問題,使其更加清晰。我認爲你的解決方案只能工作,因爲測試文件夾與你當前目錄的相對性。如果你包含完整路徑,比如'/ User//test/*',我確定它會複製'output'裏面的整個文件夾結構。 –
ThaDon
好吧,我不認爲rsync可以做到這一切,您需要將其他一些unix命令一起傳輸。我將重新回答 – 75inchpianist
併爲了記錄,不,我嘗試了完全絕對路徑,它仍然有效。請參閱上面的編輯。 – 75inchpianist