从所有子目录中移动特定文件并根据子目录重命名

从所有子目录中移动特定文件并根据子目录重命名

我在目录中有一个文件夹结构,如下所示:

/ 
A, B/Subdir Level 1/ Subdir L2/Folder A/abc.json
A, C/Subdir Level 1/ Subdir L2/Folder A/abc.json
A, D/Subdir Level 1/ Subdir L2/Folder A/abc.json 
A, F/Subdir Level 1/ Subdir L2/Folder A/abc.json 
A, G/Subdir Level 1/ Subdir L2/Folder A/abc.json 
B, Z/Subdir Level 1/ Subdir L2/Folder A/abc.json 
C, F/Subdir Level 1/ Subdir L2/Folder A/abc.json

我想复制所有 abc.json 文件并将它们放在一个 New_Folder 文件夹中,但在此过程中重命名它们,以便我知道每个 abc.json 的来源。

New_Folder/ 
A, B_abc.json (or A, Babc.json...don't really care as long as A, B appear) 
A, C_abc.json 
A, D_abc.json 

..... 等等

我如何使用 shell 脚本实现这一点。我使用 Ubuntu 14.04

答案1

这是假设您已经cd进入了想要保留在名称中的级别。您可以使用以下命令进行仔细检查find

find -type f -iname abc.json
./A, B/Subdir Level 1/Subdir L2/abc.json
./A, C/Subdir Level 1/Subdir L2/abc.json
./A, F/Subdir Level 1/Subdir L2/abc.json

假设您已经创建了文件夹 ../NewFolder,以下命令应复制所有 json 文件并将第一级子目录置于新名称中。只需确保将所有 4 行粘贴到您的终端中即可!

find -type f -iname \*.json | while read x; do
 dirname="$(echo "$x" | sed -r 's_^\.?/?__;s_/.*__')";
filename="$(echo "$x" | sed -r 's_.*/__')";
cp -v "$x" "../NewFolder/$dirname - $filename"; done

‘./A, B/Subdir Level 1/Subdir L2/abc.json’ -> ‘../NewFolder/A, B - abc.json’
‘./A, C/Subdir Level 1/Subdir L2/abc.json’ -> ‘../NewFolder/A, C - abc.json’
‘./A, F/Subdir Level 1/Subdir L2/abc.json’ -> ‘../NewFolder/A, F - abc.json’

相关内容