【问题标题】:BASH script for sorting files recursively by base filename into folders of the same name用于按基本文件名递归地将文件排序到同名文件夹中的 BASH 脚本
【发布时间】:2011-08-23 08:47:08
【问题描述】:

我的文件结构如下:

\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
  • 老年痴呆症_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_lo.mp4
  • asset_med.mp4
  • asset_hi.mp4
  • asset.txt
  • asset.adb.xml
  • asset_med.jpg

我想要一个 bash 脚本来帮我解决这些问题。有什么建议吗?

【问题讨论】:

    标签: bash shell scripting file directory


    【解决方案1】:
    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 
    

    未经测试。如果您对 mv 命令看起来正确感到满意,请删除 echo

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

    【讨论】:

    • @glenn 看起来很有希望,今晚正在测试。
    • @glenn jackman:当我只有带有 mp4 的目录时,这很有效。我得到像mv ./hi/ADHD_hi.mp4 .././hi/ADHD/ADHD_hi.mp4 这样的东西但是当我添加xml 和txt 的文件夹时,我得到mv ./captions/artificial_eye.adb.xml ..//artificial_eye.adb.xml 这是不对的。未移动到该基本名称文件夹。我认为您的脚本不是为处理“adb.xml”文件而编写的。我会玩,看看我能不能解决这个问题,但任何进一步的指示都非常感谢!
    • @two7s_*,对。在 case 语句的 *) 分支中,它找到了第一个点作为第一个字符。我会在几分钟内更新我的答案
    • 不,不适用于CAPTIONS/artificial_eye.adb.xml(甚至artificial_eye.xml)或TRANSCRIPTS/artificial_eye.txt等文件
    • @glenn:我在这个上午运行了这个,发现我没有注意到什么。这不会将每组文件的所有内容都放在同一个基本名称目录中。例如。我最终得到/captions/ADHD/ADHD.xml/txt/ADHD/ADHD.txt。每个仍然在“captions”或“txt”父级下。我希望 txt 文件和 xml 文件(以及其他文件)都在同一个 ADHD 目录中,如下所示:/ADHD/ADHD.xml/ADHD/ADHD.txt