2013-01-11 150 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