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



如何使find在其exec参数中应用shell定义的函数和别名?

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

函数7zip(){用于$@中的f;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";已完成;}

当我发现要压缩的文件超过7天时:

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

它没有展开7zip,而是错误地显示Command Not Found。

这一切都在一个shell脚本中。

您可以使用导出函数定义

export -f 7zipi

但是使用以数字开头的标识符会带来麻烦。试着把名字改成合理的名字。(例如"f7zipi"或"_7zipi")

这四个命令在函数调用中都能很好地工作。根据需要调整您的查找规格。它们都适合文件名中的空格。就我个人而言,我看不出对另一个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 1004 中使用GNUbash 4.1.5设置该函数

顺便说一句。您应该在函数中使用local 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

作为一个比我更不耐烦的编码器,现在我用将其改为多行

hitlist=$(find . -mtime +7  -name "G*.html")
7zipi $hitlist |awk ' !x[$0]++'

btw末尾的awk位使得输出只打印以前从未见过的行,这样就不会与无数行的混淆

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Compressing  [Content]      
Everything is Ok

不是确实是答案;我仍然希望找到来使用我的宏。

似乎不是每个find都会接受一个函数作为--execdir的参数。无论是原始形式还是使用export -f,它都不适用于我。

然而,如果你用你的功能制作一个脚本,它将在中工作

find . -mtime +7 -name "G*.html" -execdir  /path/to/script_7zipi {} +

最新更新