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

holgip5t  于 2023-05-16  发布在  Linux
关注(0)|答案(6)|浏览(203)

我是Linux新手。我试图写一个shell脚本,它将移动文件到某些文件夹的基础上,他们的扩展名,例如在我的下载文件夹,我有混合文件类型的所有文件。我写了下面的脚本

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

当文件添加到该文件夹时,如何使其自动运行?现在我每次都必须手动运行脚本。
还有一个问题,有没有办法把这两种说法结合起来

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

变成一份声明吗我尝试使用||(C编程'or'运算符)和逗号,但它们似乎不起作用。

7kqas0il

7kqas0il1#

将文件添加到目录时没有触发器。如果文件是通过网页上传的,您可能可以让网页执行此操作。
在unix机器上,你可以在crontab中放置一个脚本来完成这个任务(或者在windows中放置task schedular)。谷歌crontab的一个how-to。
至于组合命令,请使用以下命令:

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

您可以根据需要包含许多不同的“globs”(带通配符的文件名)。最后一项应该是目标目录。

kdfy810k

kdfy810k2#

两种方式:

  1. find . -name '*mp3' -or -name '*ogg' -print | xargs -J% mv % ../../Music
  2. find . -name '*mp3' -or -name '*ogg' -exec mv {} ../Music \;
    第一个使用管道,可能会耗尽参数空间;而第二个可能使用太多的叉并且更慢。但是,两者都会起作用。
blpfk2vs

blpfk2vs3#

另一种方式是:

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

PS:option -v显示正在发生的事情(verbose)。

r7knjye2

r7knjye24#

我喜欢这个方法:

#!/bin/bash                                                                                                                                                                                                 

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

vaj7vani5#

incron将监视文件系统并在某些事件时执行运行命令。
可以使用命令分隔符在一行中合并多个命令。无条件序列化命令分隔符是;

command1 ; command2
tf7tbtn2

tf7tbtn26#

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

相关问题