【问题标题】:Bash sanitize_file_name functionBash sanitize_file_name 函数
【发布时间】:2017-09-16 14:44:59
【问题描述】:

我正在尝试寻找一种方法来清理/过滤 Bash 脚本中的文件名,这与 WordPress 中的 sanitize_file_name 函数的工作方式完全相同。它必须接受一个文件名字符串并输出一个与该函数相同的干净版本。

You can see the function here.

GNU bash,版本 4.3.11(1)-release (x86_64-pc-linux-gnu)
Ubuntu 14.04.5 LTS(GNU/Linux 3.13.0-57-generic x86_64)
这是为 x86_64-linux-gnu-thread-multi 构建的 perl 5,版本 18,subversion 2 (v5.18.2)

输入文件名示例
这些几乎可以是并且通常是您可以在任何操作系统(尤其是 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 功率或磁盘空间,它是一个 DigitalOcean 512MB RAM 服务器。也许我可以以某种方式在 Web 服务器上创建一个远程 PHP 脚本来通过 HTTP 处理它,但我也不完全确定如何通过 Bash 来做到这一点。

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

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

【问题讨论】:

  • 向我们展示一些示例文件名和bash --version 使用的bash 版本以及您希望如何清理
  • 请删除上面的评论并将其作为问题的一部分进行更新。提供清晰且可验证的输入示例和预期输出。不幸的是,您当前的信息没有帮助
  • 对不起,我是菜鸟。我试图添加更多细节等等。除非我将文件名标记为代码,否则它不会让我保存它。

标签: php wordpress bash sanitization


【解决方案1】:

灵感来自answer

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

【讨论】:

    【解决方案2】:

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

    #!/bin/bash
    
    function sanitize_file_name {
        echo -n $1 | 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 功能,这模拟得很好。

    【讨论】:

    • 也许,您可以只使用[\s-] 而不是[\r\n\t -]。此外,1 个perl 参数也可能有效。
    猜你喜欢
    • 2018-05-18
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多