2009-08-09 90 views
13

我有几千本电子书需要组织在通过SSH运行bash的无头linux服务器上。所有的电子书都以2种习惯之一命名。根据文件名的第一部分将文件移动到目录?

  • AuthorFirstName AuthorLastName - 图书Title.pdf
  • AuthorFirstName AuthorLastName - 丛书#inSeries - 图书 Title.pdf

我想要做的是把所有的书移入有组织的系统如:

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

eg以下书籍

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文件的文件名在当前帮助目录,然后将这些文件移动到正确的目录,如果该目录不存在,则创建该目录。

回答

12
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

谢谢!这很好地解决了! sed和cut是我以前没有使用过的程序,我可以看到它们是我应该学习的东西 – 2009-08-09 19:37:33

+1

嵌套的'ls'命令是不必要的。这比绰绰有余:'用于* .pdf的f;做......我一直在想为什么人们用这种方式使用'ls'。 – greyfade 2009-08-09 21:55:15

+0

@greyfade ls存在的原因是因为否则如果当前工作目录中没有PDF文件时脚本运行时脚本会出错/失败 – 2009-08-11 00:27:35

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 
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 
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 
相关问题