根据扩展名将文件移动到相应目录

39

我是 Linux 的新手。我正在尝试编写一个 shell 脚本,可以根据文件扩展名将文件移动到特定的文件夹中,比如在我的下载文件夹中,我有各种不同类型的文件。我已经编写了下面的脚本:

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

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

还有一个问题,是否有任何方法将这两个语句合并?

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

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

如上所述

1
创建一个脚本并使用cron每隔几分钟运行它。 - Nir Alfasi
你想使用cronjob还是需要更实时的选项? - Prix
6个回答

59

当一个文件被添加到目录中时,没有触发器。如果文件是通过网页上传的,您可能可以让网页执行这个操作。

您可以在Unix机器上使用crontab将脚本放置其中以执行此操作(或在Windows上使用任务计划程序)。请搜索如何使用crontab进行操作。

至于合并命令,请使用以下命令:

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

你可以包含任意数量的“glob”(带通配符的文件名)。最后一件事应该是目标目录。


31
更好的做法是使用花括号扩展,即 *.{mp3,ogg,wav} - doubleDown
1
请注意,mv 命令可以覆盖目标目录中已经存在的文件。 - Yassir Khaldi

18

两种方式:

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

第一种方法使用了管道,可能会耗尽参数空间;而第二种方法可能会使用太多的fork,导致速度较慢。但是,这两种方式都能够工作。


为什么你只需要简单的通配符匹配就可以了,却非要用 find 呢? - doubleDown
4
find 命令可递归搜索目录,而 globbing 则不能。 - hd1
1
我撰写答案是为了给未来的搜索者和提问者 @doubleDown 提供帮助。 - hd1
“globbing will not” 不完全正确。bash v4 有一个名为 globstar 的新 shell 选项,它可以对 ** 进行递归操作。 - jaypal singh
7
你未来的搜索者可能会需要这个信息! - jaypal singh
显示剩余5条评论

5
另一种方法是:
mv -v {*.mp3,*.ogg,*.wav} ../Music
mv -v {*.mp4,*.flv} ../Videos

PS:选项-v显示正在进行的操作(详细模式)。


在 macOS 上,我需要省略花括号:mv *.mp3 path/to/dir - Benji

5

我喜欢这种方法:

#!/bin/bash                                                                                                                                                                                                 

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

该方法只是将文件移动到以其扩展名命名的目录中。然后,您可以以更清晰的方式将特定扩展名目录移动到例如音乐、视频等目录下。 - Richard L
2
欢迎来到 Stack Overflow!如果您在发布答案后需要添加额外的信息,可以点击答案下方的 [编辑] 链接进行更新,而不是发表评论。 - Dave S

3

incron 可以监视文件系统并在特定事件发生时运行命令。

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

command1 ; command2

@andrewdotn:那么你的意思是,如果没有移动MP3文件,那么也不应该移动OGG文件? - Ignacio Vazquez-Abrams
1
顺便说一句,不必等到文件关闭。在Unix中,您可以将文件移动到其他位置(只要它在同一设备上),而不会影响仍然打开它的程序。 - Niccolo M.

1
你可以使用 for循环 遍历源文件夹中的文件夹和子文件夹。以下代码将帮助您将匹配名称且具有不同扩展名的文件成对从“/source/foler/path/”移动到“/destination/fodler/path/”。请保留HTML标签。
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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接