Це можна зробити дуже просто за допомогою пошуку , як правильно запропонував Алекс: якщо припустити, що каталог для сканування файлів є / path1 / to / some / dir , і ви хочете, щоб файли перемістилися в / path2 / to / other / dir / txt і так далі,
find /path1/some/dir -type f -exec bash -c 'MYDIR=/path2/to/other/dir${0##*.}; [ -d $MYDIR ] && mv $0 $MYDIR || mv $0 /path3/to/miscellanea' {} \;
Ця команда спочатку знаходить усі файли ( -типу f ), що містяться в каталозі / path1 / to / some / dir, та всіх його підкаталогах, а потім передає ім'я кожного такого файлу ( {} ) у невеликий двошаровий bash, який спочатку витягує розширення з імені файлу (іменованого $ 0 всередині bash) і призначає його до локальної змінної оболонки MYDIR , потім перевіряє наявність відповідного каталогу (якщо такого каталогу немає, то, можливо, ми помилилися) , а якщо каталог існує ( && ... ), він переміщує файл у відповідний каталог, в іншому випадку ( || ... ) він розміщує файл у місці за замовчуванням, / path3 / до / miscellanea.
Вищенаведене передбачає, що ви вже створили необхідні каталоги, / path2 / to / other / dir / txt тощо. Якщо замість цього ви хочете створити їх у дорозі, вам доведеться змінити вищезазначене як:
find /path1/some/dir -type f -exec bash -c 'MYDIR=/path2/to/other/dir/${0##*.}; mkdir -p $MYDIR && mv $0 $MYDIR' {} \;
find
. Ви можете побудувати його як однолінійний