Move files to directories based on extension

2020-02-08 08:01发布

问题:

I am new to Linux. I am trying to write a shell script which will move files to certain folders based on their extension, like for example in my downloads folder, I have all files of mixed file types. I have written the following script

mv *.mp3 ../Music
mv *.ogg ../Music
mv *.wav ../Music
mv *.mp4 ../Videos
mv *.flv ../Videos

How can I make it run automatically when a file is added to this folder? Now I have to manually run the script each time.

One more question, is there any way of combining these 2 statements

mv *.mp3 ../../Music
mv *.ogg ../../Music

into a single statement? I tried using || (C programming 'or' operator) and comma but they don't seem to work.

回答1:

There is no trigger for when a file is added to a directory. If the file is uploaded via a webpage, you might be able to make the webpage do it.

You can put a script in crontab to do this, on unix machines (or task schedular in windows). Google crontab for a how-to.

As for combining your commands, use the following:

mv *.mp3 *.ogg ../../Music

You can include as many different "globs" (filenames with wildcards) as you like. The last thing should be the target directory.



回答2:

Two ways:

  1. find . -name '*mp3' -or -name '*ogg' -print | xargs -J% mv % ../../Music
  2. find . -name '*mp3' -or -name '*ogg' -exec mv {} ../Music \;

The first uses a pipe and may run out of argument space; while the second may use too many forks and be slower. But, both will work.



回答3:

incron will watch the filesystem and perform run commands upon certain events.

You can combine multiple commands on a single line by using a command separator. The unconditional serialized command separator is ;.

command1 ; command2


回答4:

Another way is:

mv -v {*.mp3,*.ogg,*.wav} ../Music
mv -v {*.mp4,*.flv} ../Videos

PS: option -v shows what is going on (verbose).



回答5:

I like this method:

#!/bin/bash                                                                                                                                                                                                 

for filename in *; do
  if [[ -f "$filename" ]]; then
      base=${filename%.*}
      ext=${filename#$base.}
    mkdir -p "${ext}"
    mv "$filename" "${ext}"
  fi
done


标签: linux shell