2016-04-07 41 views
3

私は、経験豊かな目で何かが分かりにくいと感じています。 rsyncが生産されています。チャレンジのために?mvコマンドはファイルを移動しますが、エラーを報告します:そのようなファイルやディレクトリを統計できません。

基本的な考え方:
私は、私は別のディレクトリからのファイルの移動を自動化していた中でbashスクリプトを持っています。

問題:
私はスクリプトを実行すると、定期的に私はmvコマンドから次のエラーを取得する:
mv: cannot stat `/shares/directory with spaces/test file.txt': No such file or directoryvmコマンドのエラーコードは1です。さらに奇妙な場合、ファイルの移動は実際には成功することがあります。

さらに、rsyncを使用して、特定のファイル(上記のmvコマンドと同じローカルファイルシステムのソースとデスティネーション)を移動/コピーするスクリプトを使用します。
rsync: link_stat "/shares/directory with spaces/test file.txt" failed: No such file or directory (2) rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]

このエラーは、スクリプトの実行時に必ずしも現れないことがあります。スクリプトが連続して実行されたときにエラーが一貫して返される場合がありますが、苦情を出さずにファイルの移動を完了することもあります。

あなたが知っておくべき追加の成分が1つあります(私は悲しみの中で重要な要素と考えています)。ディレクトリ/ shares /はDropboxのインストールによって監視されているディレクトリです - つまり、Dropboxのインストールによって監視され、ミラーリングされます。この時点で、dropboxdが何らかの形でファイルをロックしているかどうかを判断できません。明確にするために、ファイルはさらに介入することなく最終的にこの状態から解放され、mv-ableです。

コード:
mv -v --no-clobber "${SOURCEPATH}${item}" "${DESTINATIONPATH}${item}"

さらに詳しい情報:
以下のかもしれない、または、関連性がない場合があります

  • mountは、ファイルシステムがおそらくext4の
  • であることを示しています、所有権とアクセス許可はいけませんは、スクリプトがrootによって実行されているため問題になります。特に、ファイルシステムがヒューズベースでない場合。
  • パス内のベースディレクトリ(/ shares /など)は、同じファイルシステム上の別のディレクトリへのシンボリックリンクです。
  • LinuxのフレーバーはDebianです。

トラブルシューティング:「テストfile.txtとは」存在することls -al経由で確認した後
mv -v --no-clobber "/shares/directory with spaces/test file.txt" "/new destination/directory with spaces/test file.txt"

変数の展開やその内容に関する問題を排除しようとして、私はそのようなのようなbashスクリプトをハードワイヤ試してみました。参照のためのパーミッションは次のとおりです。-rw-r -r--
残念ながら、これも同じエラーに繋がります。

私は考えることができ他の可能性のある問題と、私はそれらを排除しようとするために行っている:

>>可能問題:遅いHDD(またはドライブが低電力モードになっている)、または外付けUSBドライブ
>> founds:ドライブはすべて、パークヘッドではないローカルSATAディスクです。、いいえ: Linux以外、NFSまたはヒューズベースのファイルシステム
>>調査結果:また、ファイルシステムからの読取り一貫性を強制しても、同じエラーが

>>可能性の問題を発生しました送信元と送信先が同じローカルファイルシステム上にあり、mountは、ファイルシステムはext4の

>>可能な問題であることを示します。ファイルパスに空白またはその他の印刷できない文字
>>調査結果:があることが確認します送信元と送信先のパスに正しくラップ引用符で

>>可能問題:継続の問題は後に改行(ラップコマンドで\の後のスペース)
>>調査結果をエスケープ:は、コマンドは1にすべてだったことを確認しましたライン、まだ同じエラー

>>可能問題: >>調査結果
(移動するファイルを指定することで*を使用する)グロブ:
いや、各ファイルは、パスと名前で直接指定され

>>可能問題:いいえ、ファイル・パスは、/

>>可能な問題から始めて、完全修飾されている:ファイルのローカルパスの使用
>>調査結果からパスの混乱実際のパスに
>>調査結果に指定されていません。いいえを、前ls -al

経由でスクリプトを実行するファイルを右存在していた検証>>可能問題:何とかMVの--no-クロバーが原因となった問題
>>調査結果:いや、同じエラー、なしでそれを試してみました

>>可能問題:作成したファイルだけファイルシステムへのDropboxの同期を経由して
>>所見は問題がある:いや、直接touch new-local-file.txtを介してローカルファイルを作成し、それはあまりにも同じSTAT()エラーが発生し

私の分析:
mvrsyncが同様のstat()エラーが発生するという事実を信じるように私をリード:

  • いくつかの全身根本的な境界ケース(例えばがありますファイルのパーミッション/所有権、またはファイルがビジー状態のもの)がbashスクリプトでは説明されていません。または
  • mvrsyncの両方のシナリオで同じバグが私を悩ませています。

望ましい結果:
1偶発的なエラーの根本原因を特定することができます。
2.根本的な原因は解決できます。
3. bashスクリプトを改善して、エラーが発生したときに正常に処理できるようにすることができます。

+0

詳細情報: 'mv'が終了コード> 0となったときに、ファイルに対して'/usr/bin/stat'を実行するようにbashスクリプトを編集しました。私は2つのシェルを開きました。見つけてください。 -exec stat {} \ ;;完了しました。私はソースパスにファイルをコピーして、それが見た目の 'stat'ループに現れているのを見ました。他のシェルでは、私はbashスクリプトを実行しました。 'mv'と' stat'はエラーを投げました。 'そのようなファイルはありません。 'mv'のエラーにもかかわらず、ファイルは実際に移動されました。これはなぜ 'stat'がエラーを投げたのかを説明するが、' mv'がなぜそれを行ったのか説明していない。成功したファイル移動は、ループの 'stat'の出力によっても確認されました。 –

答えて

1

したがって、さらに多くのトラブルシューティングを行うと、条件付きで実行されたスクリプトの中で誤ったrsyncという文が200行前に見つかることがありました(このように見えない矛盾した動作)。そのrsync --archive ...ステートメントがソースディレクトリとして/shares/に渡されていたため、/shares/directory with spaces/というサブディレクトリが作成されました。そのサブディレクトリは、上記の私の記事で言及されている厄介なmvコマンドの$ {SOURCEPATH}でした。

最終的にはmvに転送すると予想されていたファイルの踏み潰しを処理すると、rsync --archive ...ステートメントには--dry-runフラグがありませんでした。

私の投稿を読む時間を割いたすべての人に感謝します。私は私のスクリプトのバグであることが判明何で私とあなたの時間を費やしているとがっかりしていますが、それはそれを知って安心さ:
- コンピュータは不合理ではない
は - ありません - 私は
が 非常識ではありませんよlinuxファイルシステムのいくつかの悪質で根深いバグ

cannot statというエラーが発生しているため、今後この記事に間違いがある場合は、上記のトラブルシューティングの注意事項をお読みください。多くの研究がそのリストに入った。それらの1つがあなたの問題かもしれません。そうでなければ、デバッグを続けて、説明があります。がんばろう!