У меня есть файлы с различными расширениями, например .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
Я думаю, немного неэффективно, но благодарен за мысли.