我尝试将目录结构中的所有* .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 '{}' '+'
答案 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
以应用魔法。