Move files to directories based on extension

2020-02-08 07:21发布

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.

标签: linux shell
5条回答
男人必须洒脱
2楼-- · 2020-02-08 08:08

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楼-- · 2020-02-08 08:14

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.

查看更多
聊天终结者
4楼-- · 2020-02-08 08:14

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
查看更多
老娘就宠你
5楼-- · 2020-02-08 08:15

Another way is:

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

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

查看更多
Bombasti
6楼-- · 2020-02-08 08:18

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
查看更多
登录 后发表回答