Bash sanitize_file_name 函数

Bash sanitize_file_name function

我正在尝试找到一种在 Bash 脚本中使用 sanitize/filter 文件名的方法,其方式与 WordPress 中的 sanitize_file_name 函数完全相同。它必须接受一个文件名字符串并吐出一个与该函数相同的干净版本。

You can see the function here.

GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-57-generic x86_64)
This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi

示例输入文件名
这些可以是而且通常是您可以在任何操作系统上创建文件名的任何内容,尤其是 Mac 和 Windows.

This File + Name.mov  
Some, Other - File & Name.mov  
ANOTHER FILE 2 NAME vs2_.m4v  
some & file-name Alpha.m4v  
Some Strange & File ++ Name__.mp4  
This is a - Weird -@ Filename!.mp4

示例输出文件名
这些是 WordPress sanitize_file_name 函数制作上述示例的方式。

This-File-Name.mov  
Some-Other-File-Name.mov  
ANOTHER-FILE-2-NAME-vs2_.m4v  
some-file-name-Alpha.m4v  
Some-Strange-File-Name__.mp4  
This-is-a-Weird-@-Filename.mp4

它不仅要解决这些情况,它还执行与 sanitize_file_name 功能相同的功能,否则它会产生重复文件,并且不会在网站上更新。

我的一些想法是,也许我可以以某种方式使用该功能本身,但此视频编码服务器上没有 PHP,因为它是一个非常小的服务器,通常只是编码视频并上传它们.它没有太多内存,CPU 电源或磁盘 space,它是一个 DigitalOcean 512MB RAM 服务器。也许我可以以某种方式在网络服务器上创建一个远程 PHP 脚本来通过 HTTP 处理它,但我还是不完全确定如何通过 Bash.

来处理它

对于我有限的 Bash 技能来说太复杂了,所以我想知道是否有人可以提供帮助或知道哪里有脚本可以做到这一点。我找不到一个。我只能找到将 spaces 或特殊字符更改为下划线或破折号的脚本。但这并不是 sanitize_file_name 函数的全部功能。

如果您好奇,文件名必须与此 WordPress 功能兼容,因为该网站设置处理视频的方式。它允许人们通过 WordPress 上传视频,然后将视频发送到单独的视频服务器进行编码,然后发送到 Amazon S3 和 CloudFront 以在站点上提供服务。然而,它还允许使用外部媒体插件通过 Dropbox 添加视频(这实际上是复制视频上传与 Dropbox 同步,但这是另一个小问题)。该视频服务器还同步到 Dropbox 帐户并将其中的文件夹列入白名单,并使用此 Bash 脚本使用 inotifywait 监视 VideoServer Dropbox 文件夹,该脚本将视频从它临时复制到视频编码器编码的另一个文件夹他们。这样,当他们更新 Dropbox 中的视频时,它会自动重新编码并更新网站上显示的视频。他们可以通过 WordPress 上传文件,但出于某种原因他们似乎不想或不知道如何上传文件。

如果您安装了 Perl,请尝试:

#!/bin/bash

function sanitize_file_name {
    echo -n  | perl -pe 's/[\?\[\]\/\=<>:;,''"&$#*()|~`!{}%+]//g;' -pe 's/[\r\n\t -]+/-/g;'
}

filename="Wh00t? it's a -- re@lly-weird {file&name} (with + Plus and__1% #of# [$qRots$!]).mov"

cleaned=$(sanitize_file_name "$filename")

echo original : "$filename"
echo sanitised: "$cleaned"

结果是:

original : Wh00t? it's a -- re@lly-weird {file&name} (with + Plus and__1% #of# [$qRots$!]).mov
sanitised: Wh00t-it's-a-re@lly-weird-filename-with-Plus-and__1-of-qRots.mov

看WP函数,这个模拟的很好

灵感来自

EscapeFilename()
{
    printf '%s' "$@" | perl -pe 's/[:;,\?\[\]\/\=<>''"&$#*()|~`!{}%+]//g; s/[\s-]+/-/g;';
}