lua 获取文件名和扩展名

本文介绍了一个Lua脚本,该脚本能够从给定的字符串中解析出文件名和扩展名,并提供了URL编码和解码的功能。通过两个函数getFileName和getExtension,可以分别获取文件名和扩展名部分,而decodeURI和encodeURI则用于处理URL的编码和解码。
local str = "aaa.bbb.bbb.txt"

--获取文件名
function getFileName(str)
    local idx = str:match(".+()%.%w+$")
    if(idx) then
        return str:sub(1, idx-1)
    else
        return str
    end
end

--获取扩展名
function getExtension(str)
    return str:match(".+%.(%w+)$")
end

ngx.say("源字符串:"..str)
ngx.say("====================")
ngx.say("文件名:"..getFileName(str))
ngx.say("====================")
ngx.say("扩展名:"..getExtension(str))
 URL加码、解码

--解码
function decodeURI(s)
    s = string.gsub(s, '%%(%x%x)', function(h) return string.char(tonumber(h, 16)) end)
    return s
end

--加码
function encodeURI(s)
    s = string.gsub(s, "([^%w%.%- ])", function(c) return string.format("%%%02X", string.byte(c)) end)
    return string.gsub(s, " ", "+")
end

转自:https://www.cnblogs.com/kgdxpr/p/4218811.html

<think> 首先,用户的问题是关于在Linux上使用 `find` 命令获取所有.lua文件名后,如何打印到txt文件上。用户说:"在linux上用find *. -name .lua获取所有lua文件名后,怎么打印到txt上"。注意,用户给出的命令是 `find *. -name .lua`,但这似乎有误。标准的 `find` 命令应该从某个目录开始搜索,比如 `find . -name "*.lua"`。用户写成了 `find *. -name .lua`,这可能是个打字错误。`*.` 无效,应该是 `find . -name "*.lua"` 来查找当前目录及其子目录下所有.lua文件。 用户的问题是:如何将输出打印到txt文件上。在Linux中,这通常涉及重定向输出到文件。 所以,解决方案是使用重定向操作符 `>` 或 `>>`: - `>`:覆盖输出到文件,如果文件不存在则创建。 - `>>`:追输出到文件,如果文件不存在则创建。 因此,正确的命令应该是: ```bash find . -name "*.lua" > output.txt ``` 或者,如果用户想追而不是覆盖: ```bash find . -name "*.lua" >> output.txt ``` 用户提到的命令是 `find *. -name .lua`,这有问题: - `*.` 不是有效的路径;应该是 `.` 表示当前目录。 - `-name .lua` 会查找名为 ".lua" 的文件,而不是以 ".lua" 结尾的文件。应该是 `-name "*.lua"`。 所以,我需要纠正这个命令。 现在,回答格式要求: 1. 回答问题:给出解决方案。 2. 给出解释:解释代码。 3. 然后提出相关问题。 4. 相关问题的格式:使用 `§§相关问题§§:` 后跟1-4个相关问题。 5. 代码用markdown格式包裹。 我的回答结构: - 先纠正用户的命令。 - 给出正确的命令。 - 解释命令。 最后,提出相关问题。相关问题应该与主题相关,比如文件操作、Linux命令等。 可能的解释: - `find . -name "*.lua"`:查找当前目录及其子目录中所有扩展名为.lua的文件。 - `> output.txt`:将标准输出重定向到output.txt文件。 - 注意:如果output.txt不存在,会被创建;如果存在,会被覆盖。 为了更全面,可以提到使用 `>>` 来追。 现在,提出相关问题: 1. 如何递归查找文件但不包括某些目录? 2. 如何将错误输出也重定向到文件? 3. 如何排序输出文件中的文件名? 4. 使用其他命令如grep来过滤输出。 确保相关问题数量在1到4个。 完整回答: - 回答问题:指出错误并给出正确命令。 - 给出代码:bash命令。 - 解释代码。 - 然后相关问题。 最终回答草稿: 首先,用户给出的命令 `find *. -name .lua` 有误。正确的命令应该是 `find . -name "*.lua"` 来查找所有.lua文件。然后,使用重定向将输出保存到txt文件。 代码: ```bash find . -name "*.lua" > lua_files.txt ``` 解释: - `find .`:从当前目录开始搜索。 - `-name "*.lua"`:匹配文件名以.lua结尾的文件。 - `> lua_files.txt`:将输出重定向到文件lua_files.txt中,覆盖原有内容。 如果你想追到文件而不是覆盖,使用 `>>`。 相关问题: 1. 如何忽略某些目录,比如node_modules? 2. 如何同时将错误信息也保存到文件? 3. 如何在查找后对文件名进行排序? 4. 使用xargs来处理这些文件。 </think> ### 解决方案:将 `find` 命令的输出保存到文本文件 您在问题中提到的命令 `find *. -name .lua` 存在两个常见问题: 1. `*.` 是无效的路径语法,应改为 `.`(表示当前目录)。 2. `-name .lua` 会查找**精确匹配文件名 `.lua` 的文件**,而非所有 `.lua` 扩展名的文件。正确语法是 `-name "*.lua"`(使用通配符匹配扩展名)。 以下是修复后的命令及如何输出到文本文件: #### 1. 基础方法:重定向输出到文件 使用 `>` 操作符覆盖输出到文件,或 `>>` 追到文件: ```bash # 覆盖模式:创建或清空 output.txt 并写入结果 find . -name "*.lua" > output.txt # 追模式:新增结果到 output.txt(不覆盖旧内容) find . -name "*.lua" >> output.txt ``` #### 2. 完整示例:查找并保存所有 `.lua` 文件名 ```bash # 正确命令:查找当前目录及子目录下所有 .lua 文件,保存到 lua_files.txt find . -type f -name "*.lua" > lua_files.txt ``` ### 代码解释: ```bash find . -type f -name "*.lua" > lua_files.txt ``` - **`find .`**:从当前目录开始递归搜索。 - **`-type f`**:仅匹配文件(排除目录)。 - **`-name "*.lua"`**:匹配所有以 `.lua` 结尾的文件名(注意引号防止通配符扩展错误)。 - **`> lua_files.txt`**:将标准输出重定向到文件 `lua_files.txt`(覆盖模式)。 - **如需追**:替换 `>` 为 `>>`。 ### 验证结果 检查文件内容: ```bash cat lua_files.txt # 显示保存的文件列表 ``` ### 高级技巧 - **处理特殊字符(如空格)**:使用 `-print0` `xargs` 避免解析错误: ```bash find . -name "*.lua" -print0 | xargs -0 -I {} echo {} > output.txt ``` - **排除特定目录**:例如忽略 `node_modules`: ```bash find . -name "*.lua" ! -path "*/node_modules/*" > output.txt ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值