4

findシェルの定義された関数とエイリアスをexecパラメーター内に適用するにはどうすればよいですか?

たとえば、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"; 終わり; }

圧縮する7日より古いファイルを見つけた場合:

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

7zipを展開するのではなく、コマンドが見つかりませんというエラーが発生します。

これはすべてシェルスクリプト内にあります。

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

これらの4つのコマンドはすべて、関数呼び出しで問題なく機能します。必要に応じて検索仕様を調整します。これらはすべて、ファイル名のスペースに対応しています。個人的には、別のbashインスタンスにシェルアウトする意味がわかりませんが、bashを呼び出す2つのバージョンが含まれています。

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 {} +;   

以下は、Ubuntu10.04でGNUbash4.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

すべてfindがの引数として関数を受け入れるわけではないようです--execdir。元の形式でも、を使用しても機能しませんでしたexport -f

ただし、関数からスクリプトを作成すると、機能します

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