扫描某一个文件夹,并将所有当前/子目录的视频移动至云转码入库文件夹

 Moe @ 2019-04-17 20:17:25

说明: 上次说过如何将本地视频文件满速上传至服务器的教程→传送门,不过从该程序下载的视频文件都是带有很多特定的子文件夹,导致不好将所有下载的视频一键入库到视频库,手动一个一个移动也麻烦,所以这里就提供一个脚本,可以帮你扫描某一个大的下载目录里的文件包括所有子目录(有多少层子目录就扫多少层),然后将扫到的所有视频文件移动到云转码的入库文件夹,这样你就可以很方便的一键导入所有下载视频了,当然该脚本也适用于Aria2/ruTorrent等众多BT下载软件,这些软件下载BT的时候,也会带有很多子文件夹,所以也可以扫描下载目录。

使用

比如我使用的下载软件设置的下载目录为/root/down,云转码的入库文件夹为/express-ffmpeg/movies

先使用命令新建一个脚本:

#如果你使用的宝塔,那就可以利用宝塔的文件管理新建
nano express-movies.sh

复制如下代码:

#/bin/bash

DownDIR="/root/down"  #视频下载目录,请填上绝对路径
LocalDIR="/root/movies";  #脚本会将下载目录所有视频文件移动到该目录

cd $DownDIR
get_file(){
IFS_BAK=$IFS
IFS=$'\n'
for file in `ls -A1 .`
    do
     if [[ -d "$file" ]]; then
       eval cd \'$file\';
       get_file;
       cd ..
     else
        tfile=$(echo "$file" | tr [A-Z] [a-z]);
        if [ "${tfile##*.}"x = "mp4"x ]||[ "${tfile##*.}"x = "avi"x ]||[ "${tfile##*.}"x = "rmvb"x ]||[ "${tfile##*.}"x = "mkv"x ]||[ "${tfile##*.}"x = "rm"x ]||[ "${tfile##*.}"x = "flv"x ]||[ "${tfile##*.}"x = "mpeg"x ]||[ "${tfile##*.}"x = "vob"x ]||[ "${tfile##*.}"x = "srt"x ]||[ "${tfile##*.}"x = "ass"x ]; then
          eval mv -f \'"${file}"\' ${LocalDIR};
        fi
     fi
    done
IFS=$IFS_BAK
 }
get_file;

然后使用Ctrl+xy保存退出。

最后使用命令运行即可:

bash express-movies.sh

运行后,你会发现下载目录所有的视频文件已经成功移动到了入库文件夹,当然这里采取了强制覆盖,也就是说如果你有相同名称的资源/视频,那么最终只会存在一个。

最新回复:

a0ih6i30 @ 1 个月前:

贴一个php版本的脚本

#!/usr/bin/php
<?php
$path = $argv[1] ?? '';
$target = $argv[2] ?? '/www/movies';
$exts = ['mp4', 'rmvb', 'mkv', 'avi', 'rm', 'flv', 'mpeg', 'vob', 'srt', 'ass'];

if (!$path || !file_exists($path)) {
    echo 'error path' . PHP_EOL;
    exit;
}

if (is_file($path)) {
    cpFile($path);
} else if (is_dir($path)) {
    cpDir($path);
}

/**
 * 复制单个文件到目标目录
 *
 * @param string $source
 */
function cpFile(string $source)
{
    global $target, $exts;

    ['basename' => $name, 'extension' => $ext] = pathinfo($source);
    if (in_array($ext, $exts)) {
        copy($source, rtrim($target, '/') . '/' . $name);
    }
}

/**
 * 递归复制目录到目标目录
 *
 * @param string $source_dir
 */
function cpDir(string $source_dir)
{
    $source_dir = rtrim($source_dir, '/');
    $files = scandir($source_dir);
    foreach ($files as $file) {
        if (in_array($file, ['.', '..'])) {
            continue;
        }

        $path = $source_dir . '/' . $file;
        if (is_dir($path)) {
            cpDir($path);
        } else {
            cpFile($path);
        }
    }
}

回复
 xiezixing @ 2019-04-18 13:44:25

好东西,收入。

回复
a
 a0ih6i30 @ 2019-06-13 14:54:16

贴一个php版本的脚本

#!/usr/bin/php
<?php
$path = $argv[1] ?? '';
$target = $argv[2] ?? '/www/movies';
$exts = ['mp4', 'rmvb', 'mkv', 'avi', 'rm', 'flv', 'mpeg', 'vob', 'srt', 'ass'];

if (!$path || !file_exists($path)) {
    echo 'error path' . PHP_EOL;
    exit;
}

if (is_file($path)) {
    cpFile($path);
} else if (is_dir($path)) {
    cpDir($path);
}

/**
 * 复制单个文件到目标目录
 *
 * @param string $source
 */
function cpFile(string $source)
{
    global $target, $exts;

    ['basename' => $name, 'extension' => $ext] = pathinfo($source);
    if (in_array($ext, $exts)) {
        copy($source, rtrim($target, '/') . '/' . $name);
    }
}

/**
 * 递归复制目录到目标目录
 *
 * @param string $source_dir
 */
function cpDir(string $source_dir)
{
    $source_dir = rtrim($source_dir, '/');
    $files = scandir($source_dir);
    foreach ($files as $file) {
        if (in_array($file, ['.', '..'])) {
            continue;
        }

        $path = $source_dir . '/' . $file;
        if (is_dir($path)) {
            cpDir($path);
        } else {
            cpFile($path);
        }
    }
}

回复