加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在find的exec参数中展开bash函数

发布时间:2020-12-15 21:04:33 所属栏目:安全 来源:网络整理
导读:如何使find在其exec参数中应用我的 shell定义的函数和别名? 例如,我已经定义了一个类似于bzip2但使用7z的函数: function 7zip() { for f in $@; do ls -alF “$f”; 7za a -t7z -m0=lzma -mx=9 -mfb=64 -md=64m -ms=on “$f.7z” “$f” touch -r “$f”
如何使find在其exec参数中应用我的 shell定义的函数和别名?

例如,我已经定义了一个类似于bzip2但使用7z的函数:

function 7zip() { for f in $@; do ls -alF “$f”; 7za a -t7z -m0=lzma
-mx=9 -mfb=64 -md=64m -ms=on “$f.7z” “$f” && touch -r “$f” “$f.7z” && rm -fv “$f” && ls -alF “$f.7z”; done; }

当我找到超过7天的文件进行压缩时:

find . -mtime +7  -name "G*.html"   -execdir  7zip {}  +

而不是扩展7zip它错误命令未找到.

这都在shell脚本中.

解决方法

所有这四个命令都可以正常使用函数调用.根据需要调整您的查找规范..它们都满足文件名中的空格.就个人而言,我无法看到炮击另一个bash实例,但我已经包含了两个调用bash的版本.

IFS=$'n'; f=($(find /tmp -maxdepth 1 -name "$USER.*")); f7zipi "${f[@]}"

IFS=; find /tmp -maxdepth 1 -name "$USER.*" | while read -r f ;do f7zipi "$f"; done 

IFS=$'n'; bash -c 'IFS=; f7zipi "$@"' 0 $(find /tmp -maxdepth 1 -name "$USER.*")  

find /tmp -maxdepth 1 -name "$USER.*" -exec bash -c 'IFS=; f7zipi "$@"' 0 {} +;

接下来是我如何在Ubuntu 10.04中使用GNU bash 4.1.5设置该功能

BTW.您应该在函数中使用本地f,以便它不会与调用脚本的同名变量冲突.

这正是我添加到?/ .bashrc中的内容

function f7zipi() { 
    local f
    for f in $@; do 
        ls -alF "$f"
        7za a -si -t7z -m0=lzma -mx=9 -mfb=64 
        -md=64m -ms=on "$f.7z" < "$f" && 
            touch -r "$f" "$f.7z" && 
            rm -fv "$f" && 
            ls -alF "$f.7z"
    done
}
export -f f7zipi

当我只将上述函数分配到终端的bash命令行时,从该命令行运行的脚本在调用函数时失败…如果我进一步将export -f f7zipi应用到同一命令行..那么脚本会成功. ..但是,scipt仅适用于该特定命令行会话.

当函数和导出包含在?/ bashrc中时,脚本每次都在任何bash会话中工作.

这是测试脚本

#!/bin/bash
f=/tmp/$USER.abc
g=/tmp/$USER.lmn
rm -fv "$f" "$f".7z
rm -fv "$g" "$g".7z
printf 'abcdefg'>"$f"
printf 'lmnopqr'>"$g"
IFS=$'n'; f=($(find /tmp -maxdepth 1 -name "$USER.*")); f7zipi "${f[@]}"
exit

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读