2009-08-09 117 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 
相關問題