Rename files matching a list
Is there a way, preferably in python or BASH, to rename files from a list? for instance, track1.mp3, track2.mp3 should be renamed to the names stored in a file listing song names.
I have tried to loop a variable through directory listing and renamed them, only to find that filenames with spaces can't be assigned to a variable as a whole. To solve the problem above, I have tried the read command in BASH, which enables the program reading line by line from a list. However, It was failed to pipe the results from directory listing to the read command. Any help is appreciated ! |
Hello Qu3ry :)
Yes, it's possible. You've probably got some bash quoting issues. If you post your script we can take it from there. Best Charles |
Code:
for x in `seq 1 $(ls *.mp3|wc -l)`; do mv `ls *.mp3|head -$x|tail -1` `cat Track_List.txt|head -$x|tail -1|sed 's/[^0-9a-zA-Z]/_/g'`.mp3; done This is quick & dirty. Backup, and test first. This will replace all non-alphanumeric characters with "_". |
How to combine these two?
Condition A
Code:
#!/bin/bash Code:
#!/bin/bash ie. If condition A and B is true, then rename i into j for each iteration |
Hello Qu3ry :)
A and B are loops, not "conditions". In programming, a condition is a test -- equality, greater than, less than , existence etc. How about reading the list of files into an array first and then loop through the lines of test.txt? Code:
files=($(ls *.mp3)) $(<stuff>) is doing the same as your `<stuff>` but is more robust. $i is set to 0 before starting the loop because that is the index of the first element of the array. Putting the $j in double quotes overcomes the problem of file names including spaces; it keeps the whole name together as a single word; without the double quotes, each (whitespace separated) word of $j would become a separate argument to the echo (later mv) command. $(( <stuff> )) is for doing arithmetic. The code is proof of concept (and not tested!) rather than smart. It doesn't check for test.txt having the same number of lines as there are *.mp3 files and it would be easier to read if $j was renamed to something meaningful like $track_name. Best Charles |
Thanks catkin for your help.
Some song names listed in the file ends with a trailing ^M, probably as a result of Windows-copy-and-paste thingy. I ran the script before using the dos2unix command. Songs are bearing weird endings. For instance, songname??.mp3 I have tried to rename them by using the rename command, but in vain. Code:
#rename ^M.mp3 .mp3 * |
BTW, the following msg was found in the prompt when running your script. ( I have the echo command removed btw)
Quote:
|
Hello Qu3ry :)
The Ctrl+M characters can be removed in the script: Code:
ctlM=$'\r' Any text editor can be used to create the above script. If you are using an editor that allows insertion of Ctrl+M you wouldn't need the $ctlM variable. In vi you can enter it directly by pressing Ctrl+V then Ctrl+M. So you could replace "${j%$ctlM}" with "${j%$^M}". Best Charles |
This time is little bit different. I was about to rename a bunch of mp3 files having the following patterns:
1-01 track.mp3 1-02 track.mp3 1-03 track.mp3 1-04 track.mp3 1-05 track.mp3 1-06 track.mp3 2-01 song.mp3 2-02 song.mp3 2-03 song.mp3 2-04 song.mp3 How to merge all split files according to their track numbers? There is no info on how many parts are split for each song. The only info we know is they all have the same number prefixes. The problem with for loop is that you have to know the largest number prefix in orker to loop. Also, is there a better way to extract their filenames? Quote:
|
manipulating song lists
Problem with the tr command in BASH
I want to replace all filenames beginning with single digit prefixes into muliti-digits. For instance 1.song.mp3 into 01.song.mp3. Code:
tr '^[1-9]\.$' '0[1-9]\.' <text.txt Another interesting thing is that when text.txt is streamed through tr with the same filename as output, it didn't replace the old one with the new. Code:
tr 'a' '1' <test.txt > text.txt |
Quote:
Code:
$(( i = i + 1 )) Code:
let i=i+1 |
Quote:
|
Quote:
2.linux.mp3 3.hello.mp3 etc... |
Quote:
/usr/bin/match.sh: line 9: let: =: syntax error: operand expected (error token is "=") |
Quote:
Quote:
|
All times are GMT -5. The time now is 12:35 PM. |