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

cyb*_*e92 18 linux shell

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

mv *.mp3 ../Music
mv *.ogg ../Music
mv *.wav ../Music
mv *.mp4 ../Videos
mv *.flv ../Videos
Run Code Online (Sandbox Code Playgroud)

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

还有一个问题,是否有任何方法可以将这两个陈述结合起来

mv *.mp3 ../../Music
mv *.ogg ../../Music
Run Code Online (Sandbox Code Playgroud)

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

AMA*_*nc. 32

将文件添加到目录时没有触发器.如果通过网页上传文件,您可以使网页执行此操作.

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

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

mv *.mp3 *.ogg ../../Music
Run Code Online (Sandbox Code Playgroud)

您可以根据需要包含尽可能多的不同"globs"(带有通配符的文件名).最后一件事应该是目标目录.

  • 更好的是,使用大括号扩展即`*.{mp3,ogg,wav}` (19认同)

hd1*_*hd1 12

两种方式:

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

第一个使用管道,可能会耗尽参数空间; 而第二种可能会使用太多的叉子并且速度较慢.但是,两者都有效.

  • find 允许递归目录,而 globbing 则不会 (4认同)
  • 你未来的搜索者可能! (4认同)

小智 6

我喜欢这个方法:

#!/bin/bash                                                                                                                                                                                                 

for filename in *; do
  if [[ -f "$filename" ]]; then
      base=${filename%.*}
      ext=${filename#$base.}
    mkdir -p "${ext}"
    mv "$filename" "${ext}"
  fi
done
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出!如果您在发布答案后需要添加额外信息,您可以点击答案下方的[编辑]链接来更新它,而不是发表评论。 (2认同)

小智 5

另一种方法是:

mv -v {*.mp3,*.ogg,*.wav} ../Music
mv -v {*.mp4,*.flv} ../Videos
Run Code Online (Sandbox Code Playgroud)

PS:选项 -v 显示发生了什么(详细)。