壳牌 - 递归找到子目录和包含文件复制到另一个目录
我有以下目录 - /文件结构:壳牌 - 递归找到子目录和包含文件复制到另一个目录
/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)。
庆典解决方案:
#!/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
问题,如果目录或文件都不存在,为什么只有'mkdir'和'cp'?这不等于简单地在每个子目录上调用'mkdir -p'(如果它已经存在,则不会出现错误),然后用一个'cp -ua'来复制最新版本(或者当'$ child_d“存在时,添加一个增量编号,如'name_01.ext',并复制该文件)? –
@ DavidC.Rankin,对于不同文件夹中的相同文件--OP表示*可以被覆盖或忽略*。因此,该条件是创建/复制需要的文件夹/文件一次不用增加或生成'name_01.ext' – RomanPerekhrest
我喜欢这个解决方案,我猜如果他不担心,不需要担心,好的工作 –
为什么'train.jpg'是错过了什么? – RomanPerekhrest
只是一个打字错误 –
另一时刻是'dir_a'和'dir_b'都包含'car.jpg'文件,这些文件可能会有不同的图像。应该选择哪一个,为什么? – RomanPerekhrest