Using the contributed zmv
module in zsh
:
% autoload -Uz zmv
% zmv -v -Q 'Project/*/*/*(.N)' '$f:h_$f:t'
mv -- Project/alpha/alpha1/file1 Project/alpha/alpha1_file1
mv -- Project/alpha/alpha1/file2 Project/alpha/alpha1_file2
mv -- Project/alpha/alpha2/file1 Project/alpha/alpha2_file1
mv -- Project/alpha/alpha2/file2 Project/alpha/alpha2_file2
mv -- Project/beta/beta1/file1 Project/beta/beta1_file1
mv -- Project/beta/beta1/file2 Project/beta/beta1_file2
mv -- Project/beta/beta2/file1 Project/beta/beta2_file1
mv -- Project/beta/beta2/file2 Project/beta/beta2_file2
The -Q
switch turns on the bare glob qualifier (.N)
which matches only plain files, so that it will not attempt to move any subdirectories. The replacement pattern uses history-style head and tail modifiers.
Now we just need to remove the empty directories:
% rmdir -v Project/*/*(/^F)
rmdir: removing directory, 'Project/alpha/alpha1'
rmdir: removing directory, 'Project/alpha/alpha2'
rmdir: removing directory, 'Project/beta/beta1'
rmdir: removing directory, 'Project/beta/beta2'
leaving
% tree Project
Project
├── alpha
│ ├── alpha1_file1
│ ├── alpha1_file2
│ ├── alpha2_file1
│ └── alpha2_file2
└── beta
├── beta1_file1
├── beta1_file2
├── beta2_file1
└── beta2_file2
2 directories, 8 files