将dir结构复制并转换为唯一的文件名

时间:2017-05-26 19:53:18

标签: bash

我尝试将目录结构中的所有* .jpg文件复制到另一个目录,使用文件struture作为新文件名的模式。

示例输入:

./in/file1.jpg
./in/file2.jpg
./in/cat1/file1.jpg
./in/cat1/file2.jpg
./in/cat1/file3.jpg
./in/cat2/file1.jpg
./in/cat2/file2.jpg
./in/cat2/file3.jpg
./in/cat2/sub/file1.jpg
./in/cat2/sub/file2.jpg
./in/cat2/sub/file3.jpg

示例输出:

./out/file1.jpg
./out/file2.jpg
./out/cat1-file1.jpg
./out/cat1-file2.jpg
./out/cat1-file3.jpg
./out/cat2-file1.jpg
./out/cat2-file2.jpg
./out/cat2-file3.jpg
./out/cat2-sub-file1.jpg
./out/cat2-sub-file2.jpg
./out/cat2-sub-file3.jpg

到目前为止,我已尝试使用find,但我越接近就是使用--parents保留目录结构

$ find ./in -name '*.jpg' -exec cp --parents -t ./out '{}' '+'

2 个答案:

答案 0 :(得分:1)

您可以使用:

#!/bin/bash

mkdir -p out
cd in/

while IFS= read -d '' -r file; do
   file="${file#./}"
   echo cp "$file" ../out/"${file//\//-}"
done < <(find . -type f -print0)

对输出感到满意后,您可以在echo命令之前删除cp

答案 1 :(得分:0)

你可以很容易地做到这一点。设置:

$ cd -- "$(mktemp --directory)"
$ touch 1.jpg 2.jpg
$ mkdir -p foo/bar baz
$ touch foo/1.jpg foo/bar/1.jpg baz/1.jpg

启用魔法:

$ shopt -s globstar

用路径中的短划线替换斜杠:

$ for file in **/*/*.jpg; do echo "${file}" "${file//\//-}"; done
baz/1.jpg baz-1.jpg
foo/1.jpg foo-1.jpg
foo/bar/1.jpg foo-bar-1.jpg

现在用echo替换mv以应用魔法。