BASH脚本,用于通过基本文件名递归地将文件排序到同名文件夹中

two*_*ash 2 directory bash shell scripting file

我有以下文件结构:

\ 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

\剧照

*base_filename*_med.jpg

\ CAPTIONS

*base_filename*.adb.xml

\ TRANSCRIPTS

*base_filename*.TXT

为了将它们摄取到MarkLogic环境中,我需要将这些重新排列到以下结构中,其中asset是基本文件名.

\ ASSET

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

我想要一个bash脚本来为我排序.建议?

gle*_*man 5

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 
Run Code Online (Sandbox Code Playgroud)

未经测试.echo当你满意的mv命令看起来正确时删除.

我将目标目录移动到CWD的父目录,因为我不确定是否find会选择新创建的目录.有人可以解决这一点吗?