Need help with shell script for moving/deleting/renaming files


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Need help with shell script for moving/deleting/renaming files
# 1  
Old 02-15-2010
Question Need help with shell script for moving/deleting/renaming files

Hi.

I need help with a little script that will be used to move some files to their parent directory, delete the directory, rename one file in the parent directory and delete another, then continue to the next.

Here's an example:

/var/media/Music/Genesis/1970 album - Trespass (2008 Box - 1970-1975) [GIR - FLAC - 2008 remaster]/split/ contains these files:

01.00 - (HTOA).flac
01 - Looking for Someone.flac
02 - White Mountain.flac
03 - Visions of Angels.flac
04 - Stagnation.flac
05 - Dusk.flac
06 - The Knife.flac
folder.jpg
Trespass-split.cue

The parent directory, /var/media/Music/Genesis/1970 album - Trespass (2008 Box - 1970-1975) [GIR - FLAC - 2008 remaster]/, contains these files:

split (subdirectory)
folder.jpg
Trespass.cue
Trespass.flac

I want the script to move *.flac from the "split" directory to it's parent. After the move, the "split" directory should be deleted, together with any files remaining in it.
Then, in this example, the script should rename "Trespass.cue" to "Trespass.cue.singlefile", and delete Trespass.flac.

After that, it should move on to the next directory that contains a subdirectory named "split". Any directory that doesn't contain a subdirectory named "split" should be ignored.

The uppermost directory for this operation is /var/media/Music/.

I have some knowledge of PHP, but I guess that isn't the most efficient language for this operation.

Could anyone please help me out here? Would save me several weeks of tedious manual moving of files =)

My system is running Debian 5.0.3.
# 2  
Old 02-15-2010
Code:
find . -type d -name split |
  while IFS= read -r splitdir
  do
    (
      cd "$splitdir" || continue
      mv -f *.flac ..
      cd .. || continue
      rm -rf "$splitdir"
      for cue in *.cue
      do
        mv "$cue" "$cue.singlefile"
      done
      rm -f *.flac
    )
  done

# 3  
Old 02-15-2010
Thanks, that looks like just the right thing :-)

But, how do I execute it?

I've saved it as split.sh, added #!/bin/bash at the beginning and chmod'ed it 777, then tried to run it (both as normal user and as root) with ./split.sh, but I only get bash: ./split.sh: Permission denied or bash: ./split.sh: /bin/bash: bad interpreter: Permission denied

I've also tried to run it without the #!/bin/bash, but it won't run.


edit: I just ran it from the commandline now, and it seems to be working, kinda. I ran it in a directory I made for testing, and it seems like it fails when it tries to cd "$splitdir".

If I change the command to echo "$splitdir", I get this output: ./Iron Maiden/1980 Album - Iron Maiden [GIR - FLAC - 1998 remaster]/split. I guess the problem here is that spaces needs to be escaped. Any input on that?

All the FLAC-files in my test directory were deleted however, so I guess it was wise to test it first, hehe. I also have a backup of everything else, in case something goes wrong when the script is ready to do it's job Smilie

Last edited by aflower; 02-15-2010 at 06:11 PM..
# 4  
Old 02-15-2010
Quote:
Originally Posted by aflower
Thanks, that looks like just the right thing :-)

But, how do I execute it?

I've saved it as split.sh, added #!/bin/bash at the beginning and chmod'ed it 777, then tried to run it (both as normal

Not a good idea. Files should rarely, if ever, have world write permissions. Usually 755 is enough.
Quote:
user and as root) with ./split.sh, but I only get bash: ./split.sh: Permission denied or bash: ./split.sh: /bin/bash: bad interpreter: Permission denied

Did you write the file on a Windows box? If so, you need to remove the carriage returns.
Quote:

I've also tried to run it without the #!/bin/bash, but it won't run.


edit: I just ran it from the commandline now, and it seems to be working, kinda. I ran it in a directory I made for testing, and it seems like it fails when it tries to cd "$splitdir".

If I change the command to echo "$splitdir", I get this output: ./Iron Maiden/1980 Album - Iron Maiden [GIR - FLAC - 1998 remaster]/split. I guess the problem here is that spaces needs to be escaped. Any input on that?

Spaces in a directory name (as repugnant as they are) will not affect the script as the variable is quoted.
Quote:

All the FLAC-files in my test directory were deleted however, so I guess it was wise to test it first, hehe. I also have a backup of everything else, in case something goes wrong when the script is ready to do it's job Smilie

For testing, it is common practice to precede rm with echo.
# 5  
Old 02-16-2010
Hi. There was indeed an error in the script, but you were right about the " around $splitdir, they did the job.

The problem was that in your version, you deleted *.flac in the parent directory AFTER moving the *.flac from the split directory.

In my version, I delete *.flac from ../ BEFORE I move the *.flac.

I'm running it on my data now (have backup of course), and things seem to work as planned.

Thanks for the help :-)

Code:
 
find . -type d -name split |
  while IFS= read -r splitdir
  do
    (
      cd "$splitdir" || continue
      rm -f ../*.flac
      mv -f *.flac ..
      cd .. || continue
      rm -rf split
      for cue in *.cue
      do
        mv "$cue" "$cue.singlefile"
      done
      echo moved "$splitdir"
    )
  done

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Shell Script for renaming and moving Files - Easy?

Hey guys, ive been working on this for about 2hrs now - without any solution. At first I need to say I dont have skills in linux bash scripting, but I tried to use some codesnippets and manuals from google. What I want to do: I have different folders including 2 different filestypes with... (15 Replies)
Discussion started by: peter1337
15 Replies

2. UNIX for Dummies Questions & Answers

Moving and renaming files

I have a directory full of directories, say called A B C D E .... In each of these directories there are files called 1.dsp 2.dsp 3.dsp ..... along with others (with different extensions) I need to go through each of these directories and move the dsp file to another folder, but with the name now... (6 Replies)
Discussion started by: claire.a
6 Replies

3. Shell Programming and Scripting

Moving and renaming multiple files in a directory

Hi. I am trying to automate the movement and renaming of a number of files in a directory. I am using the 'mv' command as I do not have access to 'rename'. I have the following scripted FILES=$(ls /transfer/move/sys/mail/20130123/) if ; then for i in ${FILES} ; do mv... (4 Replies)
Discussion started by: jimbojames
4 Replies

4. Shell Programming and Scripting

Complex renaming then moving files

I am a biologist and using an program on a computer cluster that generates a lot of data. The program creates a directory named ExperimentX (where X is a number) that contains files "out.pdb" and "log.txt". I would like to create a script that renames the out.pdb file to out_ExperimentX.pdb (or... (1 Reply)
Discussion started by: yaledocker
1 Replies

5. Shell Programming and Scripting

Moving and renaming large ammount of files

Hey, I'm kinda new to the shell scripting and I don't wanna mess things up yet :) Looking for a solution to the following: I need to move all the files like "filename.failed.dateandtime" to another directory also renaming them "filename.ready". I can't figure how to do this with multiple files... (4 Replies)
Discussion started by: sg3
4 Replies

6. Shell Programming and Scripting

Need script for renaming and moving files one by one...

Dears, I need your help! I got a problem and found some workaround solution but I donno how to realize it. I have a number of files (about 300 each day) and I need them to be renamed. All these files has fixed number of letters and name looks like this one:... (7 Replies)
Discussion started by: nypreH
7 Replies

7. UNIX for Dummies Questions & Answers

Moving files out of multiple directories and renaming them in numerical order

Hi, I have 500 directories each with multiple data files inside them. The names are sort of random. For example, one directory has files named e_1.dat, e_5.dat, e_8.dat, etc. I need to move the files to a single directory and rename them all in numerical order, from 1.dat to 1000(or some... (1 Reply)
Discussion started by: renthead720
1 Replies

8. UNIX for Dummies Questions & Answers

Renaming Files using Shell Script

Hi Gurus, I have some files(all ending with .out as extension). Ex: aa1.out aa2.out aa3.out I would like to append each file with the current date to the end of the file so that they should become aa1_20090504.out. So I am using rename as follows: for i in path/aa* ; do mv $i... (5 Replies)
Discussion started by: asmfloyd
5 Replies

9. Shell Programming and Scripting

Moving multiple files and renaming them on the fly

Hi All, Being new to scripting I am facing a new situation. We have an application that generates a file lets say dumpfile for each user under the users home directory when they execute the application. This is quite a huge file and imagine having that for over 40 users on a daily basis. The... (1 Reply)
Discussion started by: daemongk
1 Replies

10. Shell Programming and Scripting

moving and renaming multiple files

Greetings, I know i can use the mv command to move and rename one file. How can I do this with multiple files? example pic01.bmp to pic0001.bmp how can i perform this function on an entire directory of sequential files and keep them in sequence? Hints, suggestions are most welcome:) ... (1 Reply)
Discussion started by: rocinante
1 Replies
Login or Register to Ask a Question