我有一批文件,它们都以相同的字符串结尾,即:*_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 *