30

我是 Linux 新手。我正在尝试编写一个 shell 脚本,它将根据文件的扩展名将文件移动到某些文件夹,例如在我的下载文件夹中,我有所有混合文件类型的文件。我写了以下脚本

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

将文件添加到此文件夹时,如何使其自动运行?现在我每次都必须手动运行脚本。

还有一个问题,有什么方法可以结合这两个语句

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

成一个单一的声明?我尝试使用||(C 编程“或”运算符)和逗号,但它们似乎不起作用。

4

6 回答 6

49

将文件添加到目录时没有触发器。如果文件是通过网页上传的,您也许可以让网页上传。

您可以在 crontab 中放置一个脚本来执行此操作,在 unix 机器上(或 Windows 中的任务计划)。谷歌 crontab 的操作方法。

至于组合您的命令,请使用以下命令:

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

您可以根据需要包含任意数量的不同“glob”(带有通配符的文件名)。最后一件事应该是目标目录。

于 2013-06-27T03:30:03.810 回答
14

两种方式:

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

第一个使用管道,可能会用完参数空间;而第二个可能使用太多的叉子并且速度较慢。但是,两者都会起作用。

于 2013-06-27T03:31:22.300 回答
4

我喜欢这种方法:

#!/bin/bash                                                                                                                                                                                                 

for filename in *; do
  if [[ -f "$filename" ]]; then
      base=${filename%.*}
      ext=${filename#$base.}
    mkdir -p "${ext}"
    mv "$filename" "${ext}"
  fi
done
于 2019-03-10T11:51:52.353 回答
3

incron将监视文件系统并在某些事件上执行运行命令。

您可以使用命令分隔符将多个命令组合在一行中。无条件序列化命令分隔符是;.

command1 ; command2
于 2013-06-27T03:30:09.673 回答
2

另一种方法是:

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

PS:选项 -v 显示正在发生的事情(详细)。

于 2017-11-01T23:34:37.030 回答
1

您可以使用for 循环遍历源文件夹中的文件夹和子文件夹。以下代码将帮助您将文件从“/source/foler/path/”成对移动到“/destination/fodler/path/”。此代码将移动与其名称匹配并具有不同扩展名的文件。

for d in /source/folder/path/*; do
    ls -tr $d |grep txt | rev | cut -f 2 -d '.' | rev | uniq | head -n 4 | xargs -I % bash -c 'mv -v '$d'/%.{txt,csv} /destination/folder/path/'
    sleep 30
done 
于 2020-04-14T09:46:13.353 回答