递归地将子目录中的文件移动到同名的新子目录中

递归地将子目录中的文件移动到同名的新子目录中

我有一批文件,它们都以相同的字符串结尾,即:*_ext.dat位于给定主目录中的几个子目录中,与几个其他文件一起。结构如下:

/main_dir/subdir1/file11_ext.dat
/main_dir/subdir1/file12_ext.dat
/main_dir/subdir1/file13_ext.dat
/main_dir/subdir1/file14_other.dat
/main_dir/subdir1/file15_other.dat

/main_dir/subdir2/file21_ext.dat
/main_dir/subdir2/file22_ext.dat
/main_dir/subdir2/file23_ext.dat
/main_dir/subdir2/file24_other.dat
/main_dir/subdir2/file25_other.dat

/main_dir/subdir3/file31_ext.dat
/main_dir/subdir3/file32_ext.dat
/main_dir/subdir3/file33_ext.dat
/main_dir/subdir3/file34_other.dat
/main_dir/subdir3/file35_other.dat

我需要递归移动仅有的以结尾的文件*_ext.dat放入新的主目录中new_dir,尊重子目录结构,因此文件最终会进入一个等效的目录结构,如下所示:

/new_dir/subdir1/file11_ext.dat
/new_dir/subdir1/file12_ext.dat
/new_dir/subdir1/file13_ext.dat

/new_dir/subdir2/file21_ext.dat
/new_dir/subdir2/file22_ext.dat
/new_dir/subdir2/file23_ext.dat

/new_dir/subdir3/file31_ext.dat
/new_dir/subdir3/file32_ext.dat
/new_dir/subdir3/file33_ext.dat

因此,该命令还应该创造这些子目录及其对应的名称。我知道有这样一行:

find . -name "*_ext.dat" -print0 | xargs -0 rm -rf

我可以删除所有这些文件,但我不知道如何修改它以满足我的需要(或者是否可能)。

答案1

new_dir我将首先创建子目录

cd main_dir
for i in *; do mkdir "../new_dir/$i"; done
cd ..

然后,您可以再次使用bash命令for以及模式扩展来快速完成您需要的操作:

for i in main_dir/*/*_ext.dat; do cp "$i" "new_dir${i##main_dir}"; done

使用目标目录存在的事实。最后,如果不能保证每个其中的大部分都会被实际使用,之后你可以清除空的:

cd new_dir
rmdir --ignore-fail-on-non-empty *

相关内容