2013-01-11 149 views
1

我wan't複製包含文件和文件夾特定的文件夾結構,並具有輸出,告訴用戶複製多遠。輸出文件夾/文件名複製

目前我使用以下方法來複制結構內部消除某些特定的文件夾:

cp -rfv !(Project.buildoutput) $Project_SYNC_DIR 

cp -v輸出非常難看:

> _55_studio.tests/singles/CustomIdentifier.file -> /Users/<path>/_55_studio.tests/singles/CustomIdentifier.file build.sh 
> -> /Users/<path>/build.sh 

是否有可能只輸出1級元素用乾淨的名字。

我目前的文件夾結構:

_55_studio 
--singles 
--mixed 
_55_studio.tests 
--singles 
build.sh 
project.settings 

輸出,同時複製以下:

Copy folder _55_studio 
Copy folder _55_studio.tests 
Copy file build.sh 
Copy file project.settings 

是否有一個有效的方式來實現這一目標,以及如何?

BR,使用find mybecks

在一襯墊

回答

1

這裏:

find "/path/to/dir" -maxdepth 1 -mindepth 1 -name "Project.buildoutput" -prune -o -exec /bin/bash -c "echo -en \"Copy \"; \ 
                             [ -d '{}' ] && echo -en \"folder \";\ 
                             [ -f '{}' ] && echo -en \"file \"; \ 
                             basename '{}'; \ 
                             cp -fr '{}' \"$Project_SYNC_DIR\"" \; 

輸出:

Copy folder _55_studio 
Copy folder _55_studio.tests 
Copy file build.sh 
Copy file project.settings 
1

步驟1中,提取目錄:

sed -e 's#^\([^/]\+\) -> .*$#\1#g' -e 's#^\([^/]\+\)/.*$#\1#g' 

第一替換,替換線路是這樣的:

`file_name' -> `path/to/copy/file_name' 

到:

file_name 

而第二個取代,取代像這樣的線:

`path/to/file' -> `other/path/to/copy/file' 

到:

path 

請注意,我添加了`和'因爲我的CP添加它們。

步驟2中,刪除重複:

uniq 

步驟3中,檢查以查看它是否是一個文件或目錄:

while read f; do \ 
    if [ -d $f ]; then \ 
    echo Copy folder $f \ 
    else \ 
    echo Copy file $f \ 
    fi \ 
done 

因此:

cp -rfv !(Project.buildoutput) $Project_SYNC_DIR | \ 
    sed -e 's#^`\([^/]\+\)'"'"' -> .*$#\1#g' \ 
     -e 's#^`\([^/]\+\)/.*$#\1#g' | \ 
    uniq | \ 
    while read f; do \ 
    if [ -d $f ]; then \ 
     echo Copy folder $f; \ 
    else \ 
     echo Copy file $f; \ 
    fi \ 
    done 
1

一種有效的方式來得到非常接近你問:

for src in !(Project.buildoutput); do 
    stat -c "Copy %-14F %n" "${src}"; cp -rf "$src" $Project_SYNC_DIR; done 

(需要shopt -s extglob擴展globbing:!反轉匹配)

或顯示上面使用的每一個文件/目錄

unbuffer cp -rfv !(Project.buildoutput) $Project_SYNC_DIR | 
    while read src dd dst; do stat -c "Copy %-14F %n" "$src"; done 

GNU stat,對於* BSD使用stat -f "Copy %-14SHT %N"代替。

我(GNU的coreutils 6.9)cp -v堅持在輸出打印破行情,快速黑客與上述工作是一個tr添加到管道:

... | tr -d \`\' | while ... 

如果您有空格或單 - 在你的文件/目錄名稱中引用一些更詳細的內容。

如果你喜歡perl來完成你的繁重工作(並處理「引用」);

... | perl -ne $'/\`(.*)\' -> \`(.*)\'/ && 
    printf("Copy %-14s %s\n",(-f $1 ? "file" : -d $1 ? "directory" : "<other>"),$1);' 

這應該是更有效的,如果你有很多文件,因爲只需要一個額外的過程中,每複製的文件/目錄沒有之一。

更多的反饋複製過程中常見的解決辦法是使用rsync代替:

rsync --progress -hrv src/ dest/ 

rsynccp更有效,它不會複製它並不需要,加上「-W」的文件強制複製像cp