13

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

  • AuthorFirstName AuthorLastName - 书名.pdf
  • AuthorFirstName AuthorLastName - Book Series #inSeries - Book Title.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 文件的文件名,然后将文件移动到正确的目录,如果该目录尚不存在则创建该目录。

4

4 回答 4

15
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
于 2009-08-09T18:38:44.087 回答
3

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

#!/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
于 2009-08-09T19:52:18.480 回答
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
于 2009-08-10T09:35:57.913 回答
1
对于 *.pdf 中的 i;做
  目录=$(回显“$i”|\
    sed 's/\(.\)\([^ ]\+\) \([^ ]\+\) - \(.*\)\.pdf/\1\/\1\2 \3/' )
  dir="目标目录/$dir"
  mkdir -p -- "$dir" && mv -uv "$i" "$dir/$i"
完毕
于 2009-08-09T21:37:32.137 回答