Отфильтровывать одинаковые расширения файлов из сложных подкаталогов по имени файла и поддерживать структуру подкаталогов - PullRequest
0 голосов
/ 16 марта 2020

У меня есть файлы с различными расширениями, например .pdf .do c et c et c, разбросанные по разным глубоко вложенным подкаталогам моей исходной папки. Я хочу переместить их так, чтобы в целевой папке создавались новые подкаталоги, каждый с именем расширения, так что, например, новый подкаталог pdf / содержит только файлы .pdf в исходной структуре, сохраняется, doc / содержит только .do c файлы и снова в исходных структурах каталогов.

В качестве примера:

SOURCE DIR / содержит 2 подкаталога; SUBDIR1 / который имеет 1.pdf 2.do c 3.txt, а также SUBDIR2 / который имеет 1a.pdf и 2a.do c

По завершении команды я хочу новый TARGET DIR (например, на том же уровне, что и SOURCE DIR), чтобы содержать новые подкаталоги, сформированные из расширений найденных файлов, pdf / doc / и txt /

pdf / содержит SUBDIR1 / 1.pdf и SUBDIR2 / 1a. pdf doc / содержит SUBDIR1 / 2.do c и SUBDIR2 / 2a.do c и txt / содержит только SUBDIR1 / 3.txt (я не против, если там есть пустой каталог SUBDIR2, если это помогает).

и так далее до самого нижнего уровня.

Я думаю, что теперь решил это, но это кажется немного неэффективным.

Сначала псевдоним bash:


alias sort_extensions_in_subdirectories='find . -type f | rev | cut -d. -f1 | rev  | tr '[:upper:]' '[:lower:]' | sort | grep -v '/' | uniq  | sort -rn > ../directory_list ;  env_parallel  $HOME/Scripts/move-named-files-to-top.sh *.{} < ../directory_list ; \rm ../directory_list '


, который вызывает move-named-files-to-top. sh, что


#!/bin/bash                                                                                                                                                                                                                                                                                                                                                                                                               
find . \( -iname "*$1*" \) -print >> "/tmp//""$1""filelist.txt" ;
sed -i -e 's/^.//g' "/tmp/""$1""filelist.txt" ;
mkdir -p "../$1"  ;
/usr/bin/nice /opt/local/bin/rsync    -avehPL --inplace --no-compress  --remove-source-files  --files-from="/tmp/""$1""filelist.txt"   ./ "../$1/" ; \rm   "/tmp/""$1""filelist.txt" "/tmp/""$1""filelist.txt-e" ;
cd ..
for x in "*."* ; do
    \mv  $x `echo $x | cut -c 3-`
done


Я думаю, немного неэффективно, но благодарен за мысли.

...