Linux:复制最新目录(名称有空格)

时间:2015-07-04 13:41:03

标签: linux awk

我正在使用Linux,我的目录结构如下:

- RootFolder
  * DirectoryA
    * * Directory(X) [1]
    * * Directory Y
    * * DirectoryZ
 * DirectoryB

请注意括号,方括号和空格等特殊字符。

实际上,DirectoryA有很多子目录,但是出于本示例的目的,我们要说我想将最近创建的2个目录(包含内容)从DirectoryA复制到DirectoryB。

我的第一次尝试是cd到RootFolder并运行以下命令:

ls -lt DirectoryA | head -2 | awk '{print "cp -r " $9 " DirectoryB/"$9 | sh

由于各个子目录中的特殊字符而导致失败并返回:

cp: can't stat Directory
cp: can't stat Directory(X)

有人可以建议如何修改我的命令以使用空格和特殊字符吗?

2 个答案:

答案 0 :(得分:0)

报价有帮助:

127.0.0.1 - - [04/Jul/2015 17:18:47] "GET /imgsizer/beastie.png?v=VZfrJw&w=100&s=2_gsJZCVk-gvUm4VD-OD6ZuXjbY HTTP/1.1" 200 -

我添加了一个ls -t DirectoryA | head -2 | awk '{print "cp -vr \"DirectoryA/" $0 "\" DirectoryB/" }' |sh 选项来显示它的作用:

-v

但是,如果文件名包含双引号,或者它们包含`DirectoryA/DirectoryZ' -> `DirectoryB/DirectoryZ' `DirectoryA/Directory Y' -> `DirectoryB/Directory Y' 除了问号之外不代表的字符,则会遇到问题。

答案 1 :(得分:0)

作为替代方案,您可以使用,在内置模块File::Spec::Functions的帮助下处理文件及其路径,以及外部File::Copy::Recursive来完成整个工作。将需要从CPAN或类似地安装,并递归复制目录:

perl -MFile::Spec::Functions=catfile,catdir,splitdir -MFile::Copy::Recursive=rcopy -E ' 
    $dest = catdir(($ARGV[0], $ARGV[2]));
    $orig = catdir(($ARGV[0], $ARGV[1]));
    opendir $dh, $orig or die;
    for $f ( 
            sort { (stat $b)[9] <=> (stat $a)[9] } 
            grep { -d $_ and $_ !~ m/\.\.?$/ } 
            map { catfile $orig, $_ } 
            readdir $dh)[0..1] ) {

        rcopy($f, catdir $dest, (splitdir $f)[-1]) or die $!;
    }
' /your/path/to/RootFolder DirectoryA DirectoryB

它接受三个参数,第一个是RootFolder的路径,第二个是from,最后一个是togrep过滤掉非目录文件和特殊条目,sort检查其修改时间,切片[0..1]仅在修改时间内获得最近的两个。

它在我的测试中起作用但是如果它与你完全不匹配,我希望它接近终点线,所以你可以给它一个推动力。