A little case scenario:
I used Rhythmbox to copy some songs to my cell phone’s memory card, and I had a nasty surprise: they all got separated into various directories, and I dislike that.
I didn’t want to manually move each file… So, instead of spending a few minutes doing just that, I spent a couple of hours finding out what piping is and stuff like that.
Most examples are very unrealistic. (“Let’s imagine we have file1, we move it to dir1…”) So I’ll use my particular case as an example.
Okay so I had all my MP3s deep into two directories each: Author / Album / Song
As some of the songs had incorrect or no information, most directories had one or two songs each. It was chaotic to find a song!
Important: If you don’t know what piping is, read this great visual explanation.
We can do this in the Terminal, from the directory that has all our subdirectories/MP3s:
find . -name "*.mp3" | while read n; do cp "$n" /new/path/; done
In the first part, we find all the MP3 files in the current directory (the dot) and its subdirectories. Then, we read its output, line by line. Each line is saved in a variable called n. As each line is, in fact, a file with its complete path, we simply use it as the source argument for the cp command.
Note: I encapsulated “$n” in quotes, otherwise, files with spaces will throw errors.
Note 2: You can replace the copy command (cp) with the move command (mv).
That way, all files are copied into one directory. ;-)