BASH скрипт для рекурсивной сортировки файлов по базовому имени файла в одноименные папки - PullRequest
2 голосов
/ 11 мая 2011

У меня следующая файловая структура:

\ HI

  • ActionPotential_hi.mp4
  • ADHD_hi.mp4
  • AlzheimersDisease_hi.mp4
  • alzheimers_art_hi.mp4
  • artificial_eye_hi.mp4
  • больше файлов ...

\ LO

  • ActionPotential_lo.mp4
  • ADHD_lo.mp4
  • AlzheimersDisease_lo.mp4
  • alzheimers_art_lo.mp4
  • artificial_eye_lo.mp4
  • и т.д.

\ MED

* base_filename * _med.mp4

\ STILLS

* base_filename * _med.jpg

\ CAPTIONS

* base_filename * .adb.xml

\ транскриптов

* base_filename * .txt

Чтобы внедрить их в среду MarkLogic, мне нужно, чтобы они были преобразованы в следующую структуру, где asset - это базовое имя файла.

\ АКТИВ

  • asset_lo.mp4
  • asset_med.mp4
  • asset_hi.mp4
  • asset.txt
  • asset.adb.xml
  • asset_med.jpg

Я бы хотел, чтобы bash-скрипт разбирался со мной. Предложения?

1 Ответ

5 голосов
/ 11 мая 2011
find . -type f -print |
while read -r pathname; do
    filename=${pathname##*/}
    case "$filename" in
        *_hi* | *_med* | *_lo*)
            # strip off last underscore and following chars
            new_dirname=${filename%_*} 
            ;;
        *)
            # strip off first dot and following chars
            new_dirname=${filename%%.*} 
            ;;
    esac
    mkdir -p "../$new_dirname"
    echo mv "$pathname" "../$new_dirname/$filename"
done 

непроверенная. Удалите echo, когда все команды mv выглядят правильно.

Я переместил каталоги назначения в родительский каталог CWD, потому что я не уверен, подберет ли find только что созданные каталоги. Кто-то может обратиться к этому вопросу?

...