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

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

以下两篇帖子:

将文件移动到父目录,将文件名作为前一个子目录名称的前缀

递归地将目录名添加到文件名

我想做同样的事情,但用复制而不是移动。简单来说,我有一个包含子目录和子子目录的目录,里面有一些文件。我想将所有文件复制到另一个目标文件夹,但由于某些文件具有完全相同的名称,因此我想将父目录的名称作为文件名的前缀附加。

我在 ubuntu 16.04 上运行

答案1

鉴于

$ tree folder1
folder1
├── folder2
│   ├── folder3
│   │   ├── name1.csv
│   │   ├── name2.csv
│   │   └── name3.csv
│   ├── name1.csv
│   ├── name2.csv
│   └── name3.csv
├── name1.csv
├── name2.csv
└── name3.csv

2 directories, 9 files

然后您可以做这样的事情来替换/原始中的每个路径分隔符(),_例如:

$ find folder1 -type f -exec bash -c '
    for f; do echo cp -n "$f" path/to/newdir/"${f//\//_}"; done
' bash {} +
cp folder1/folder2/folder3/name2.csv path/to/newdir/folder1_folder2_folder3_name2.csv
cp folder1/folder2/folder3/name3.csv path/to/newdir/folder1_folder2_folder3_name3.csv
cp folder1/folder2/folder3/name1.csv path/to/newdir/folder1_folder2_folder3_name1.csv
cp folder1/folder2/name2.csv path/to/newdir/folder1_folder2_name2.csv
cp folder1/folder2/name3.csv path/to/newdir/folder1_folder2_name3.csv
cp folder1/folder2/name1.csv path/to/newdir/folder1_folder2_name1.csv
cp folder1/name2.csv path/to/newdir/folder1_name2.csv
cp folder1/name3.csv path/to/newdir/folder1_name3.csv
cp folder1/name1.csv path/to/newdir/folder1_name1.csv

请注意,如果原始文件或文件夹名称已包含该字符,则这不能保证唯一的命名_(这就是我包含-nno-clobber 开关的原因 - 以防万一)。当然,您可以自由选择不同的(或不使用)分隔符。

echo一旦您确信它正在做正确的事情,就将其删除。

相关内容