如何使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 {} +