2017-09-24 71 views
1

我有以下目录 - /文件结构:壳牌 - 递归找到子目录和包含文件复制到另一个目录

/test 
    /dir_a 
     /dir_pic 
      car.jpg 
      train.jpg 
      thumbs.db 
    /dir_b 
     /dir_pic 
      car.jpg 
      plane.jpg 
      boat.jpg 
    /dir_c 
     /dir_pic 
      ship.jpg 
      space_shuttle.jpg 

我想复制文件创建以下结构:

/test2 
    /c 
     /car 
      car.jpg 
    /b 
     /boat 
      boat.jpg 
    /p 
     /plane 
      plane.jpg 
    /s 
     /ship 
      ship.jpg 
     /space shuttle 
      space shuttle.jpg 
    /t 
     /train 
      train.jpg 

我创建了子目录for i in {a..z}; do mkdir ordner${i}; done, 但我不知道如何创建子目录以及如何复制文件。 我试过类似find /test/ -type d -name ".dir_pic" | xargs -0 -I%%% cp %%%/${i}*.jpg /test2/,但那不起作用。 除了for-loops不起作用,特别是当路径包含空白时?

由于我的Linux知识非常有限,所以我会恳请您的帮助如何实现这一点(Ubuntu 16.04 LTS)。

+0

为什么'train.jpg'是错过了什么? – RomanPerekhrest

+0

只是一个打字错误 –

+0

另一时刻是'dir_a'和'dir_b'都包含'car.jpg'文件,这些文件可能会有不同的图像。应该选择哪一个,为什么? – RomanPerekhrest

回答

1

庆典解决方案:

#!/bin/bash 

dest_dir="/test2"   # destination directory 

for f in $(find /test/ -type f -path "*/dir_pic/*.jpg"); do 
    fn="${f##*/}"   # filename (basename) 
    parent_d="${fn:0:1}" # parent directory 
    child_d="${fn%.*}" # child directory 

    if [[ ! -d "$dest_dir/$parent_d/$child_d" ]]; then 
     mkdir -p "$dest_dir/$parent_d/$child_d" 
     cp "$f" "$dest_dir/$parent_d/$child_d/$fn" 
    fi 
done 

查看结果:

$ tree /test2 
|-- b 
| `-- boat 
|  `-- boat.jpg 
|-- c 
| `-- car 
|  `-- car.jpg 
|-- p 
| `-- plane 
|  `-- plane.jpg 
|-- s 
| |-- ship 
| | `-- ship.jpg 
| `-- space_shuttle 
|  `-- space_shuttle.jpg 
|-- t 
| `-- train 
|  `-- train.jpg 
+0

问题,如果目录或文件都不存在,为什么只有'mkdir'和'cp'?这不等于简单地在每个子目录上调用'mkdir -p'(如果它已经存在,则不会出现错误),然后用一个'cp -ua'来复制最新版本(或者当'$ child_d“存在时,添加一个增量编号,如'name_01.ext',并复制该文件)? –

+0

@ DavidC.Rankin,对于不同文件夹中的相同文件--OP表示*可以被覆盖或忽略*。因此,该条件是创建/复制需要的文件夹/文件一次不用增加或生成'name_01.ext' – RomanPerekhrest

+1

我喜欢这个解决方案,我猜如果他不担心,不需要担心,好的工作 –

相关问题