我是Linux新手。我正在尝试编写一个shell脚本,根据文件扩展名将文件移动到某些文件夹,例如在我的下载文件夹中,我有所有混合文件类型的文件。我写了以下脚本
mv *.mp3 ../Music
mv *.ogg ../Music
mv *.wav ../Music
mv *.mp4 ../Videos
mv *.flv ../Videos
如何在将文件添加到此文件夹时自动运行?现在我每次都必须手动运行脚本。
还有一个问题,是否有任何方法可以将这两个陈述结合起来
mv *.mp3 ../../Music
mv *.ogg ../../Music
进入单一声明?我尝试使用||
(C编程'或'运算符)和逗号,但它们似乎不起作用。
答案 0 :(得分:29)
将文件添加到目录时没有触发器。如果文件是通过网页上传的,您可以将网页设为上传。
您可以在crontab中放置一个脚本来执行此操作,在unix机器上(或Windows中的任务计划)。 Google crontab提供了一个操作方法。
至于组合命令,请使用以下命令:
mv *.mp3 *.ogg ../../Music
您可以根据需要添加尽可能多的不同“globs”(带通配符的文件名)。最后一件事应该是目标目录。
答案 1 :(得分:11)
两种方式:
find . -name '*mp3' -or -name '*ogg' -print | xargs -J% mv % ../../Music
find . -name '*mp3' -or -name '*ogg' -exec mv {} ../Music \;
第一个使用管道,可能会耗尽参数空间;而第二种可能会使用太多的叉子并且速度较慢。但是,两者都有效。
答案 2 :(得分:2)
答案 3 :(得分:2)
另一种方式是:
mv -v {*.mp3,*.ogg,*.wav} ../Music
mv -v {*.mp4,*.flv} ../Videos
PS:选项-v显示正在发生的事情(详细)。
答案 4 :(得分: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
答案 5 :(得分:0)
我喜欢这种方法:
#!/bin/bash
for filename in *; do
if [[ -f "$filename" ]]; then
base=${filename%.*}
ext=${filename#$base.}
mkdir -p "${ext}"
mv "$filename" "${ext}"
fi
done