2

パラメータ$dir、$ year、$ monthにハードコードされた値を使用してコマンドラインでこのコマンドを使用すると、非常にうまく機能し、gzipファイルが作成されます。gzファイルの内容を確認したところ、目的の結果が得られました。

find $dir -name '*_$year-$month-*' -type f -print | \
xargs tar -zvcf $dir/log.$year-$month.tar.gz

しかし、これをシェルスクリプトに埋め込んで実行すると、実行されず、このエラーが発生します。

tar: Cowardly refusing to create an empty archive

4

3 に答える 3

2

まず第一に、あなたのワンライナーは引用の問題でいっぱいです:

  • $dirディレクトリ名に空白が含まれていると壊れます。"$dir"代わりに必要です

  • 一重引用符は変数の展開を防ぎます -'*_$year-$month-*'おそらくそうあるべき"*_$year-$month-*"です。

    シェル スクリプト コードでfindは、 はどのファイルとも一致しないため (文字列 を含むファイル名はあり_$year-$month-ませんよね?)、したがってtar、アーカイブに含めるファイルは提供されません。

補足としてxargs、この特定のケースでの使用は危険です。ファイルが多すぎる場合、が複数回xargs呼び出され、最後に実行された以外のアーカイブされたファイルは上書きされるため、アーカイブから消去されます。tar

さらに、このコマンドは、空白を含むファイル パスでも中断されます。デフォルトでxargsは、引数の区切り文字として空白が使用されます。find使用しているおよびxargsバイナリのバージョンによっては、この問題に対処-print0するための検索オプションと一致-0オプションがある場合があります。xargs

find ... -print0 | xargs -0 ...

最後に、一部のxargsバージョンには、引数が指定されていない場合に指定されたコマンドの呼び出しを回避するオプションがあります-GNU の場合、これxargs-rオプションです:

find ... -print0 | xargs -0 -r ...
于 2013-01-24T16:41:17.367 に答える
0

単一引用符内では変数置換は行われません。

二重引用符を使用します。find "$dir" -name "*_$year-$month-*" ...

(必要に応じて、同じ引数内でさまざまな種類の引用符を使用できます(ここではありません)'*_'"$year":)

于 2013-01-24T16:41:52.733 に答える
0

可能であれば、シェルスクリプトからコンソールに, ,echoの値を試してみてください。これらの値がシェルスクリプトで異なる可能性があります。$dir$year$month

第二に、findシェルtarスクリプトはどれを使用していますか? 診断にフル パスを使用する$PATHか、コマンド ラインからコマンドを実行したときに得られる値と一致するように の値を変更してみてください。

于 2013-01-24T16:42:48.350 に答える