0
find /ABC/ \
    -type f \
    -exec \
    sh -c  ' if [  echo "1" > ${1} ] ; then   if [ "$(cat ${1})" != "1" ]; then [ echo ${1} ]  ; fi ; fi ' _ {} \;

私のスクリプトはこれをしたい:

フォルダー内のすべてのファイルを検索します。ファイルに 1 を書き込みます。「1」が正しく書かれていないか確認してください。このファイルの名前を出力します。

前。私はこの2つのステップを行いました。(1) 書き込み (2) 読み取りチェック。今、私はこれら2つを組み合わせています。1ファイル書き終わったらすぐに確認したいので。

しかし、私のスクリプトには何か問題があります。助けが必要。ありがとうございました。それは私のエラーを与える:

sh: 1: unknown operand

私は何かが不一致だと思います/私はシェルの経験があまりないので. 皆さんの助けが必要です

4

2 に答える 2

1

これを試して:

 find . -type f -exec sh -c 'echo "1" >> "${1}"; if [ "$(cat ${1})" != "1" ]; then echo "${1}" ; fi' _ {} \;

最初から正しく見えなかったため、コマンドをテストしませんでした。

ただし、いくつかの注意事項:

echo "1" > "${1}"ファイルを上書きします。>>追加したい場合に使用します。

[はコマンドです ( test.

then [ echo ${1} ]はこのテストを間違って使用しています。ここではテストは必要ありません。

他の回答によると、必要ないのでif [ echo...、 if テストを完全に削除しました。

于 2012-08-16T00:41:07.437 に答える
1
if [  echo "1" > ${1} ] ; then

[通常のコマンドです。これは、ほぼすべてに組み込まれていますshが、通常どおりに解析されます。つまり> ${1}、「パラメーターとして名前が渡されたファイルに出力をリダイレクトする」ことを意味します。2 つの数値を比較する場合は、次の-gt演算子を使用します。

if [ 1 -gt "$1" ]; then …

1ファイルに書き込みたい場合は、条件付きコマンドではechoなく、コマンドを使用します[ … ](これは、名前で呼び出すこともできますtest)。

if echo 1 >"$1"; then …

echo 1 >"$1"成功した場合、ファイルには実際にそこに置いたテキストが含まれている可能性が高いことに注意してください。これが起こらないのは、次の場合だけです。

  • パイプやデバイスなどの特殊なファイルの場合$1(これらは によって一致しないため、発生しません-type f)。
  • ファイルから読み取ったものが最後に書き込まれたものではない特別なファイルシステムに が存在する場合 — これは奇妙なファイルシステムであり、ディスク上のストレージ用のファイルシステムではありません。
  • その間に他のプログラムがファイルを変更した場合、これは時間枠が短いため可能性は低いですが、不可能ではありません。
于 2012-08-16T00:44:25.597 に答える