# scripting help



## Killer_Rubber_Ducky (Dec 25, 2012)

Hi guys,

I'm not familiar with scripting but I have a task and have found no program to accomplish the task. 

I read alot of ebooks in different formats: epub, pdf, rtf, etc
I have different folders for the formats. 
I have to move them from the Downloads folder to the respective folders which can be annoying and time consuming since there tend to be quite a few.

I need either a script or a program that can watch my Downloads folder and move the files to the folders.

The path for the downloads folder is /home/ian/Downloads
The path for the RTF folder is: /home/ian/Documents/Fanfiction/RTF
The path for the EPUB folder is: /home/ian/Documents/Fanficiton/EPUB
The path for the PDF folder is: /home/ian/Documents/Fanfiction/PDF
and the path for the HTML folder is: /home/ian/Documents/Fanfiction/HTML

There is a windows program that does this called QuickMove.


----------



## Mindweaver (Dec 26, 2012)

Here is a batch file you can use.

*Copy this into a text file and rename the text file to .bat*


```
@echo off

color 9F
echo ### Mindweaver's File Mover
ECHO ---------------------------
ECHO -
ECHO -
ECHO Select a type of file to move.
ECHO 1. PDF
ECHO 2. RTF
ECHO 3. EPUB
ECHO 4. HTML
ECHO 5. ALL

set PDF=%USERPROFILE%\Downloads\*.pdf
set RTF=%USERPROFILE%\Downloads\*.rtf
set EPUB=%USERPROFILE%\Downloads\*.epub
set HTML=%USERPROFILE%\Downloads\*.html
set folder1=%USERPROFILE%\Documents\PDF
set folder2=%USERPROFILE%\Documents\RTF
set folder3=%USERPROFILE%\Documents\EPUB
set folder4=%USERPROFILE%\Documents\HTML
set Movecmd=Move /y

set /p userinp=choose a number(1-5):
set userinp=%userinp:~0,1%
if "%userinp%"=="1" goto 1
if "%userinp%"=="2" goto 2
if "%userinp%"=="3" goto 3
if "%userinp%"=="4" goto 4
if "%userinp%"=="5" goto 5


:1
CLS
echo ### Moving PDF's
%Movecmd% "%PDF%" "%folder1%"
GOTO EXIT

:2
CLS
echo ### Moving RTF's
%Movecmd% "%RTF%" "%folder2%"
GOTO EXIT

:3
CLS
echo ### Moving EPUB's
%Movecmd% "%EPUB%" "%folder3%"
GOTO EXIT

:4
CLS
echo ### Moving HTML's
%Movecmd% "%HTML%" "%folder4%"
GOTO EXIT

:5
CLS
echo ### Moving PDF's
%Movecmd% "%PDF%" "%folder4%"
echo 25% complete
%Movecmd% "%RTF%" "%folder2%"
echo 50% complete
%Movecmd% "%EPUB%" "%folder3%"
echo 75% complete
%Movecmd% "%HTML%" "%folder4%"
GOTO EXIT

:EXIT
echo Move Complete!
@pause
```


----------



## Killer_Rubber_Ducky (Dec 26, 2012)

This will work in linux right? It looks very close to BASIC


----------



## Mindweaver (Dec 26, 2012)

Killer_Rubber_Ducky said:


> This will work in linux right? It looks very close to BASIC



Naw.. I quickly copied an old windows batch file I had and posted it for you.. I'm working on a Linux one now.. I have an old Unix one I use to use... Should still work  Sorry buddy and I moved this thread back to the Linux thread.

*EDIT: I left the code here for Windows users.. Linux would be something like this for the move command. *

```
#!/bin/bash
mv from to
```
*
You can use CASE instead of GOTO*


----------



## Aquinus (Dec 26, 2012)

Killer_Rubber_Ducky said:


> This will work in linux right? It looks very close to BASIC



The BASH form would be pretty easy.

It would look something like this (I don't think a UI is necessary):


```
#!/bin/bash
pathfrom="/path/to/downloads/folder"
pathto="/path/to/store/files"

mv "$pathfrom/*.pdf" "$pathto/PDF"
mv "$pathfrom/*.rtf" "$pathto/RTF"
mv "$pathfrom/*.epub" "$pathto/EPUB"
mv "$pathfrom/*.html" "$pathto/HTML"
```

Basically is just moves everything it encounters when you run the script. This should work, but I haven't tested it.

Edit: If you wanted a UI, you could easily just add a SWITCH/CASE statement plus a little usage output.

@Mindweaver: Ewww, really? GOTO?


----------



## MT Alex (Dec 26, 2012)

Just use Calibre and convert them into one file type, or keep them all in a single Calibre folder since Calibre will open them all, anyhow.


----------



## Killer_Rubber_Ducky (Dec 26, 2012)

MT Alex said:


> Just use Calibre and convert them into one file type, or keep them all in a single Calibre folder since Calibre will open them all, anyhow.



I actually use flagfic to handle it. Then fbreader for the reading. I tried calibre but every time it screws up the format. I like rtf and html but sometimes it looks and reads better through pdf or epub.

****Update****
Here is what I get when I run the script.

```
ian@ian-Lenovo-G570:~$ ./quickmove.sh
./quickmove.sh: line 2: pathfrom: command not found
./quickmove.sh: line 3: pathto: command not found
mv: cannot stat `/*.pdf': No such file or directory
mv: cannot stat `/*.rtf': No such file or directory
mv: cannot stat `/*.epub': No such file or directory
mv: cannot stat `/*.html': No such file or directory
ian@ian-Lenovo-G570:~$ ./quickmove.sh
./quickmove.sh: line 2: /home/ian/Downloads: Is a directory
./quickmove.sh: line 3: /home/ian/Documents/Fanfiction: Is a directory
mv: cannot stat `/*.pdf': No such file or directory
mv: cannot stat `/*.rtf': No such file or directory
mv: cannot stat `/*.epub': No such file or directory
mv: cannot stat `/*.html': No such file or directory
ian@ian-Lenovo-G570:~$
```

Here is the script:

```
#!/bin/bash
pathfrom= "/home/ian/Downloads"
pathto= "/home/ian/Documents/Fanfiction"

mv "$pathfrom/*.pdf" "$pathto/PDF"
mv "$pathfrom/*.rtf" "$pathto/RTF"
mv "$pathfrom/*.epub" "$pathto/EPUB"
mv "$pathfrom/*.html" "$pathto/HTML"
```


----------



## Mindweaver (Dec 27, 2012)

Killer_Rubber_Ducky said:


> I actually use flagfic to handle it. Then fbreader for the reading. I tried calibre but every time it screws up the format. I like rtf and html but sometimes it looks and reads better through pdf or epub.
> 
> ****Update****
> Here is what I get when I run the script.
> ...



Your paths are wrong. Try doing it with out declaring Variables. When you get the path correct then clean up your code and declare variables. 


```
#!/bin/bash
mv /home/ian/Downloads /home/ian/Documents/Fanfiction/PDF
mv /home/ian/Downloads /home/ian/Documents/Fanfiction/RTF
mv /home/ian/Downloads /home/ian/Documents/Fanfiction/EPUB
mv /home/ian/Downloads /home/ian/Documents/Fanfiction/HTML
```


----------



## Killer_Rubber_Ducky (Dec 27, 2012)

Aquinus said:


> The BASH form would be pretty easy.
> 
> It would look something like this (I don't think a UI is necessary):
> 
> ...





Mindweaver said:


> Your paths are wrong. Try doing it with out declaring Variables. When you get the path correct then clean up your code and declare variables.
> 
> 
> ```
> ...



Thanks for clearing that up. I found a working solution on bashscripts.org.

Here is my code:

```
#!/bin/bash
#Ian's File Moving Script


shopt -s extglob
mv -f $HOME/Downloads/*.pdf $HOME/Documents/Fanfiction/PDF
mv -f $HOME/Downloads/*.rtf $HOME/Documents/Fanfiction/RTF
mv -f $HOME/Downloads/*.epub $HOME/Documents/Fanfiction/EPUB
mv -f $HOME/Downloads/*.html $HOME/Documents/Fanfiction/HTML/NewDownloads/December
```

The Only thing missing that i have yet to figure out is how to make it not post errors when the file type is not found. Maybe have it say " no .ext found" when there are no files of said extention. And "(x) .ext files moved" when files are moved. the (x) being the number of files under that extension.


----------



## Aquinus (Dec 27, 2012)

Killer_Rubber_Ducky said:


> The Only thing missing that i have yet to figure out is how to make it not post errors when the file type is not found. Maybe have it say " no .ext found" when there are no files of said extention. And "(x) .ext files moved" when files are moved. the (x) being the number of files under that extension.



add a stderr redirection 





> mv -f /x/y/z a/b/c 2> /dev/null


 That will pipe stderr to nothing. If you want to make a log, then just replace /dev/null with the location of your log.



Mindweaver said:


> Your paths are wrong. Try doing it with out declaring Variables. When you get the path correct then clean up your code and declare variables.



The variable didn't work because his syntax was wrong. No space between the variable name, equals, and the path string.


```
#correct: variablex="applepie"
#incorrect: variablex= "applepie"
```

If you use linux, I highly recommend learning BASH.


----------



## SIGSEGV (Dec 27, 2012)

Aquinus said:


> The variable didn't work because his syntax was wrong. No space between the variable name, equals, and the path string.



i don't think so, it's clear enough for me given by that error messages, bash cannot find program called pathto and pathfrom, you should remember that bash will evaluate every line and find the appropriate program to execute, except you put $ in front of variable.


```
#!/bin/bash
$pathfrom="/path/to/downloads/folder"
$pathto="/path/to/store/files"

mv "$pathfrom/*.pdf" "$pathto/PDF"
mv "$pathfrom/*.rtf" "$pathto/RTF"
mv "$pathfrom/*.epub" "$pathto/EPUB"
mv "$pathfrom/*.html" "$pathto/HTML"
```

fixed



```
#correct: $variablex="applepie"
#correct: $variablex= "applepie"
```

this code is allowed in bash and has same meaning


----------



## Aquinus (Dec 27, 2012)

SIGSEGV said:


> this code is allowed in bash and has same meaning



Someone doesn't know what they're talking about and should refrain from posting when that is the case. 
Sounds like the OP poster isn't the only person who needs to learn BASH...


```
jdoane@khan:~$ somevar1="someweirdstring"
jdoane@khan:~$ somevar2= "someweirdstring"
someweirdstring: command not found
jdoane@khan:~$ echo $somevar1
someweirdstring
jdoane@khan:~$ echo $somevar2

jdoane@khan:~$
```

You also only use the $ when you're referencing the variable, not when you're assigning it...

```
jdoane@khan:~$ $someothervar="applepie"
=applepie: command not found
```


----------



## Killer_Rubber_Ducky (Dec 27, 2012)

Aquinus said:


> add a stderr redirection  That will pipe stderr to nothing. If you want to make a log, then just replace /dev/null with the location of your log.
> 
> 
> 
> ...


well, im in a networking degree program and this next semester we will be covering Linux Administration so I will be learning it. I am more familiar with BASICA/GWBASIC/QBASIC. I wrote Pacman in QBASIC.


----------



## Aquinus (Dec 27, 2012)

Killer_Rubber_Ducky said:


> well, im in a networking degree program and this next semester we will be covering Linux Administration so I will be learning it.


Right on. Get a head start, it's an administrator's best friend. 


Killer_Rubber_Ducky said:


> I wrote Pacman in QBASIC.


Nice! Back when I was in school I wrote a networked version of Backgammon using Java in my second year while I was working on my Computer Science degree. It's fun stuff, at least to me.


----------



## SIGSEGV (Dec 27, 2012)

Aquinus said:


> Someone doesn't know what they're talking about and should refrain from posting when that is the case.
> Sounds like the OP poster isn't the only person who needs to learn BASH...
> 
> 
> ...



i thougt it was the same syntax (and also rules) with php or another programming languages when you're assigning some value to any kind of variable.. .
i found it funny..

thanks for your correction


----------



## Aquinus (Dec 27, 2012)

SIGSEGV said:


> i thougt it was the same syntax (and also rules) with php or another programming languages when you're assigning some value to any kind of variable.. .
> i found it funny..
> 
> thanks for your correction



If I'm not sure, I always test it out. You can never assume that the syntax of different languages will be similar. It definitely is an odd one, that's for sure, but on the other hand BASH was developed with a lot of different things in mind as compared to PHP, Java, ruby, or any other programming language for that matter, considering BASH isn't a programming language, it's a command processor. You write scripts that get evaluated by the processor as input, unlike PHP which gets compiled at runtime (unless you're using an opcode cache.)


----------



## Mindweaver (Dec 27, 2012)

Aquinus said:


> The variable didn't work because his syntax was wrong. No space between the variable name, equals, and the path string.



I seen that, but I wanted him to see that as well.  I'd rather him start out not using variables until he understands bash better.  Call it bias of me, but I tend not to give the full answer as quickly to Linux users as I do Windows users. :shadedshu I know I shouldn't, but I do..


----------

