Переместить файлы в каталоги на основе первой части имени файла? - PullRequest
13 голосов
/ 09 августа 2009

У меня есть несколько тысяч электронных книг, которые необходимо организовать на безголовом сервере Linux, работающем через bash через SSH. К счастью, все электронные книги названы одним из двух соглашений.

  • AuthorFirstName AuthorLastName - Название книги.pdf
  • AuthorFirstName AuthorLastName - Серия книг #inSeries - Книга 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 ]

13 голосов
/ 09 августа 2009
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
3 голосов
/ 09 августа 2009

На самом деле нашел другой способ сделать это, просто подумал, что я опубликую это, чтобы другие могли увидеть / использовать, если они захотят.

#!/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 голосов
/ 10 августа 2009

@ 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
1 голос
/ 10 августа 2009
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...