コマンドラインで、「find」は不正な時間値を報告します


1

次のコマンドを実行します。

見つける 。-mtime -60s

すると、代わりに次の出力が表示されます。

CLIENT% echo `date +%s`-1308741881 | bc
5152
CLIENT% find . -mtime -`echo `date +%s`-1308741881 | bc`s
-1308741881: Command not found.
find: -mtime: -date: illegal time value
CLIENT%

何が起きてる?

回答:


6

問題は、コマンドで出力を置き換える必要があるコマンドを示すために `マークが使用されることです。したがって、コマンドは実際には3つのコマンドです。

  1. "echo"(1マークの最初のセットに含まれる)
  2. 「-1308741881 | bc」(1マークの2番目のセットに含まれる)
  3. 見つける 。-mtime- コマンド#1から出力 date +%s コマンド#2から出力

-1308741881は有効なコマンドではないため、コマンド#1は何も出力せず、コマンド#2は「コマンドが見つかりません」というエラーになります。

最後に、3番目のコマンドが実行され、これらの置換が次のようになります。

find . -mtime -date

また、「-date」は有効な時間ではないため、「不正な時間値」と言って文句を言う

根本的な問題は、ネストされた ``マークを使用しようとしていることです。これは、シェルが2つの別個のコマンドとして解釈するものです。

あなたが望むものを表現するより良い方法はこれです(bashの場合):

find . -mtime -$(echo $(date +%s-1308741881) | bc)s

cshの場合:

set now=`date +%s-1308741881`; set date=`echo $now | bc`s; find . -mtime -$date

そして、おそらく他のシェル(未テスト)の場合:

NOW=`date +%s-1308741881`; DATE=`echo $NOW | bc`; find . -mtime -${DATE}s

PS私はこれがあなたが期待することをしないと思います...あなたの日付コマンドは秒数を返しますが、-mtimeは入力として日数を期待します。おそらく、それに応じて日付コマンドを調整する必要があると思います。


CLIENT%find。-mtime-$(echo $(date +%s-1308741881)| bc)s無効な変数名。
user87005

どのシェルを使用していますか?多分それは$()構文を理解していません
Flimzy

私は、他のシェルでより良く機能するかもしれない同じコマンドの別のバージョンで答えを更新しました。うまくいくかどうか教えてください。
Flimzy

1
cshシェルを使用しています。
user87005

さて、cshで動作するようにテストしたコマンドを使用して、もう一度回答を追加しました。ただし、findは有効な-mtimeパラメーターとして「seconds」を受け入れないことに注意してください(少なくとも私のバージョンのfindではそうではありません)。そのため、コマンドは依然として失敗します。
Flimzy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.