继这两篇帖子之后:
https://askubuntu.com/questions/870844/recursively-add-directory-name-to-file-name
我想做同样的事情,但复制而不是移动。简单地说,我有一个包含子目录和子子目录的目录,里面有一些文件。我想将所有文件复制到另一个目标文件夹,但由于某些文件具有确切的名称,因此我想将父目录的名称作为前缀附加到文件名。
我在 ubuntu 16.04 上运行
答案1
尝试:
find -name "*.dat" -exec bash -c 'echo cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"' tinyscript {} \;
(如果命令看起来不错,请删除“echo”)
.
└── 1
└── 2
├── 3
│ └── 4
│ └── foo.dat
└── foo.dat
产量:
cp ./1/2/3/4/foo.dat ./1-2-3-4-foo.dat
cp ./1/2/foo.dat ./1-2-foo.dat
基本上,您运行一个临时小脚本(在每个匹配的文件上,该脚本通过将源路径中的cp "$1" "$(sed -e s:/:-:g -e s:^.-:./: <<<"$1")"
所有内容替换为 来生成目标名称。该字符串可以是任何内容,它只是用作脚本名称的名称如果出现错误。/
-
tinyscript
答案2
考虑到简单性而不是性能,这并不是特别有效(由于为每个文件启动一个 bash 进程)。如果您有大量文件和/或时间是一个因素,则可能需要更复杂的解决方案。
find yourdirectory/ -type f -print0 | xargs -0 -I% bash -c 'F="%" ; echo cp "${F}" "${F//\//-}"'