4

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

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

function 7zip() { for f in $@; 做 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它错误命令未找到。

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

4

4 回答 4

2

您可以使用以下命令导出函数定义:

export -f 7zipi

但是使用名称以数字开头的标识符是自找麻烦。尝试将名称更改为合理的名称。(例如“f7zipi”或“_7zipi”)

于 2012-03-16T12:02:33.303 回答
1

作为比我不耐烦的编码员,现在我将其更改为多行:

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

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

虽然不是真正的答案;我仍然想找到通常使用我的宏。

于 2012-03-16T12:21:16.767 回答
1

所有这四个命令都可以与函数调用一起正常工作。根据需要调整您的查找规范。它们都适合文件名中的空格。就个人而言,我看不出使用另一个 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

顺便提一句。你应该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
于 2012-03-16T16:09:21.060 回答
0

Seems that not every find will accept a function as an argument for --execdir. It did not work for me either in the original form or using export -f.

However, if your make a script out of your function, it will work

find . -mtime +7 -name "G*.html" -execdir  /path/to/script_7zipi {} +
于 2012-03-16T14:17:28.737 回答