根据文件名的第一部分将文件移动到目录?

时间:2009-08-09 18:32:55

标签: bash filenames

我需要在通过SSH运行bash的无头linux服务器上组织数千个电子书。值得庆幸的是,所有的电子书都以2种惯例之一命名。

  • AuthorFirstName AuthorLastName - Book Title.pdf
  • AuthorFirstName AuthorLastName - Book Series #inSeries - Book Title.pdf

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

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

e.g。以下书籍

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 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分: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

答案 2 :(得分: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 :(得分:1)

for i in *.pdf; do
  dir=$(echo "$i" | \
    sed 's/\(.\)\([^ ]\+\) \([^ ]\+\) - \(.*\)\.pdf/\1\/\1\2 \3/')
  dir="DestinationDirectory/$dir"
  mkdir -p -- "$dir" && mv -uv "$i" "$dir/$i"
done