Shell - 递归查找子目录并将包含文件的副本复制到另一个目录

时间:2017-09-24 18:13:56

标签: linux shell unix find xargs

我有以下目录/文件结构:

/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循环不起作用,特别是当路径包含空白时?

由于我的Linux知识非常有限,我很乐意请求您如何实现这一点(Ubuntu 16.04 LTS)。

1 个答案:

答案 0 :(得分:1)

bash 解决方案:

#!/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