2

У меня есть пакет файлов, все заканчивающиеся одной и той же строкой, а именно: *_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 , с учетом структуры sub-dir, чтобы файлы в конечном итоге оказались в эквивалентной структуре 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 ответ1

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 *

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .