【问题标题】:Move files to directories based on extension根据扩展名将文件移动到目录
【发布时间】:2020-04-14 17:46:13
【问题描述】:

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

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

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

还有一个问题,有没有办法把这两个语句结合起来

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

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

【问题讨论】:

  • 创建一个脚本并使用 cron 每隔几分钟运行一次
  • cronjob 是一个选项还是你想要更实时的东西?

标签: linux shell


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 更好的是,使用大括号扩展,即*.{mp3,ogg,wav}
【解决方案2】:

两种方式:

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

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

【讨论】:

  • 当简单的 globbing 就足够时,为什么还需要 find
  • find 允许将递归目录,globbing 不会
  • OP 似乎不需要递归
  • 我为未来的搜索者以及 OP @doubleDown 写下我的答案
  • 您未来的搜索者可能会!
【解决方案3】:

我喜欢这种方法:

#!/bin/bash                                                                                                                                                                                                 

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

【讨论】:

  • 该方法只是将文件移动到以它们的扩展名命名的目录中。然后您可以更清晰地移动特定的扩展目录,例如音乐视频等。
  • 欢迎来到 Stack Overflow!如果您在发布答案后需要在答案中添加额外信息,可以单击答案下方的edit 链接进行更新,而不是发表评论。
【解决方案4】:

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

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

command1 ; command2

【讨论】:

  • @andrewdotn:那么你的意思是,如果没有 MP3 被移动,那么 OGG 也不应该被移动?
  • 顺便说一句,不必等到文件关闭。在 Unix 中,您可以移动文件(只要它在同一设备上),而不会影响仍然打开它的程序。
【解决方案5】:

另一种方式是:

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

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

【讨论】:

    【解决方案6】:

    您可以使用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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2019-09-13
      • 2014-06-06
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多