我正在使用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)
有人可以建议如何修改我的命令以使用空格和特殊字符吗?
答案 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)
作为替代方案,您可以使用perl,在内置模块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
,最后一个是to
。 grep
过滤掉非目录文件和特殊条目,sort
检查其修改时间,切片[0..1]
仅在修改时间内获得最近的两个。
它在我的测试中起作用但是如果它与你完全不匹配,我希望它接近终点线,所以你可以给它一个推动力。