将子目录和子子目录中的所有文件复制到主目录,并通过添加所有父目录的前缀来修改文件名

将子目录和子子目录中的所有文件复制到主目录,并通过添加所有父目录的前缀来修改文件名

继这两篇帖子之后:

https://askubuntu.com/questions/871898/move-files-to-parent-directory-prefixing-file-name-with-former-subdirectory-nam

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//\//-}"'

相关内容