【问题标题】:Move files to directories based on first part of filename?根据文件名的第一部分将文件移动到目录?
【发布时间】:2023-04-10 08:55:01
【问题描述】:

我有几千本电子书需要整理在通过 SSH 运行 bash 的无头 linux 服务器上。谢天谢地,所有电子书都以两种约定之一命名。

  • AuthorFirstName AuthorLastName - 书名.pdf
  • AuthorFirstName AuthorLastName - Book Series #inSeries - Book 标题.pdf

我想做的是将所有书籍移动到一个有组织的系统中,例如:

`DestinationDirectory/FirstLetterOfAuthorFirstName/Author Full Name/pdf's`

例如以下书籍

Andrew Weiner - Changes.pdf 
Allan Cole - Timura Trilogy 01 - When the Gods Slept.pdf

应放在以下文件夹中

/books/A/Allan Cole/Allan Cole - Timura Trilogy 01 - When the Gods Slept.pdf
/books/A/Andrew Weiner/Andrew Weiner - Changes.pdf

我需要有关如何将这一切放入 bash 脚本的帮助,该脚本将获取当前目录中所有 PDF 文件的文件名,然后将文件移动到正确的目录,如果尚未创建目录,则创建该目录存在。

【问题讨论】:

    标签: bash filenames


    【解决方案1】:
    for f in *.pdf; do
        name=`echo "$f"|sed 's/ -.*//'`
        letter=`echo "$name"|cut -c1`
        dir="DestinationDirectory/$letter/$name"
        mkdir -p "$dir"
        mv "$f" "$dir"
    done
    

    【讨论】:

    • 谢谢!效果很好! sed 和 cut 是我以前没有使用过的程序,我可以看到它们是我应该学习的东西
    • 嵌套的ls 命令是不必要的。这绰绰有余:for f in *.pdf; do ... 我一直想知道为什么人们以这种方式使用ls
    • @greyfade ls 存在的原因是因为否则脚本在运行时如果当前工作目录中没有 PDF 文件会出错/失败
    【解决方案2】:

    @OP 你可以用 bash 做到这一点

    dest="/tmp"
    OFS=$IFS
    IFS="-"
    for f in *.pdf
    do
        base=${f%.pdf}
        letter=${base:0:1}
        set -- $base
        fullname=$1
        pdfname=$2
        directory="$dest/$letter/$fullname"
        mkdir -p $directory
        cp "$f" $directory
    done
    IFS=$OFS
    

    【讨论】:

      【解决方案3】:
      对于 *.pdf 中的 i;做 目录=$(回显“$i”|\ sed 's/\(.\)\([^ ]\+\) \([^ ]\+\) - \(.*\)\.pdf/\1\/\1\2 \3/' ) dir="目标目录/$dir" mkdir -p -- "$dir" && mv -uv "$i" "$dir/$i" 完毕

      【讨论】:

        【解决方案4】:

        实际上找到了一种不同的方法,只是想我会发布这个给其他人看/如果他们愿意的话。

        #!/bin/bash
        dir="/books"
        if [[ `ls | grep -c pdf` == 0 ]]
        then
                echo "NO PDF FILES"
        else
                for src in *.pdf
                do
                        author=${src%%-*}
                        authorlength=$((${#author}-1))
                        letter=${author:0:1}
                        author=${author:0:$authorlength}
                        mkdir -p "$dir/$letter/$author"
                        mv -u "$src" "$dir/$letter/$author"
                done
        fi
        

        【讨论】:

          最近更新 更多