13

SSH を介して bash を実行しているヘッドレス Linux サーバーで整理する必要がある数千の電子ブックがあります。すべての電子ブックには、ありがたいことに、2 つの規則のいずれかで名前が付けられています。

  • AuthorFirstName AuthorLastName - 本のタイトル.pdf
  • AuthorFirstName AuthorLastName - ブック シリーズ #inSeries - ブック タイトル.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

現在のディレクトリにあるすべての PDF ファイルのファイル名を取得し、ファイルを適切なディレクトリに移動して、ディレクトリがまだ存在しない場合は作成する bash スクリプトにこれをすべて入れる方法について助けが必要です。

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 の場合。行う
  dir=$(echo "$i" | \
    sed 's/\(.\)\([^ ]\+\) \([^ ]\+\) - \(.*\)\.pdf/\1\/\1\2 \3/' )
  dir="DestinationDirectory/$dir"
  mkdir -p -- "$dir" && mv -uv "$i" "$dir/$i"
終わり
于 2009-08-09T21:37:32.137 に答える