エラー:Linux "find"は、最初の実行時に文字列を含むすべてのディレクトリを見つけるか名前を変更できませんでした。

エラー:Linux

次のコマンドを使用して、findファイル構造(何百ものフォルダ、約4レベルの深さ)で実行しましたfind "/media/$disk/_all" -depth -type d -exec/execdir rename -d 's/ 1000k/ [1000k]/' "{}" \;。 1000kを含むフォルダの中には、まだ名前が変更されていないことを繰り返し指摘し、その一部は2番目に名前が変更されていないことを確認しました。私が実行したときにコマンドの名前が変更されました。最初からすべて実行してみてはいかがでしょうか?

また、出力に「/media/some_original /media/some_renamed: そのファイルまたはディレクトリの名前を変更できません」というメッセージが頻繁に表示されることを確認しました。その後、some_originalの名前がsome_renamedに正常に変更されました。

私の考えでは、最初のエラーはfindがすべてのツリーを巡回しないために発生し、2番目のエラーはfindがツリーの一部/全体を実行してexecを2回呼び出すために発生することです。記入。後で、「子」フォルダの名前が「親」フォルダの前に変更されたことを確認するために-深さオプションを追加しましたが、役に立ちませんでした(私の場合は、エラーが検出されたときに複数のレベルであるため、これを認識できませんでした)。名前変更によるものです)。

Webで検索しても答えが出ませんね。ここで何が間違っている可能性がありますか?

システムはLinux Mint 20.1です。

追加:確認しましたが、ls -lR /path/to/folder | grep ^l fromを使用して構造内のリンクを見つけることができません。https://stackoverflow.com/questions/8513133/how-do-i-find-all-of-the-symlinks-in-a-directory-tree

ディスクの取り付け方法は次のとおりです。 ext4 (rw,nosuid,nodev,relatime,stripe=8191,uhelper=udisks2) と入力します。

ベストアンサー1

予備説明

  • この答えは、実際に何が起こったのかを明確に説明するのではなく、実際に何が起こったのかを説明しようとします。これが原因です:

    • OPはコマンドのさまざまなバリエーションを試みました(インクルードまたは除外-depth、インクルード、-execまたはインクルード-execdir)。質問本文に掲載されている正確なコマンドは、いくつかの意味で受け入れる必要があります。
    • 試行するたびにディレクトリツリーが変更される可能性がありますが、正確なコマンドによって発生した名前の変更を示すログはありません。
    • 繰り返しますが、エラーログはありません。
    • コメントとチャットで問題を分析したところ、同様のエラーメッセージを生成する問題がほとんどないことがわかりました。したがって、問題が1つしかないと仮定するのは簡単です。

    このため、単一の作成を試してみてください。MCVE(正確なディレクトリツリーと正確なコマンドの形でfind)失敗します。我々は可能な質問に取り組んで、将来の読者を念頭に置いて答えを書くことが最善であることに同意した。この答えはまさにそれです。

  • 持つ1つ以上rename。議論された構文は、renameLarry WallおよびRobin Barkerに関連するPerlスクリプトに適用されます。これが使われていると思いますrename。しかし、この回答で扱う問題はこれに限定されませんrename


何が起こったのかもしれません。

No such file or directory使用中に他のfindいくつかの問題が発生する可能性がありますrename

まず、この例を単純化してみましょう。ディレクトリ構造が次のと仮定します。

/a/b/c.1/c.2/d

コマンドは次のとおりです。

find /a/b -exec rename s/c/X/ {} \;

このコマンドは以下を生成します。

find: '/a/b/c.1': No such file or directory

にドロップを試みる前の-depth find過程がないからです。処理中に名前は次のように変更されますが、名前の変更を認識しません。より深いファイルを処理しようとしましたが、もはや存在しません。これは次のようによく似ています。c.1c.2c.1renameX.1findc.1c.1findそして使用rm -r

コマンドの2回目の繰り返しでは、に名前が変更され、正常に/a/b/X.1/c.2/d名前が変更されc.2ますX.2c.23回目の繰り返しでは、何もしないし、何も文句を言わない。

ディレクトリ自体に対して作業を実行する前に、find処理するディレクトリ内のファイルを知っておく必要があります。それが-depth目的です。


それでも-depth問題がある可能性があります。今回も次のような構造を使用します。

/a/b/c.1/c.2/d

そして「fixed」コマンドを実行してください:

find /a/b -depth -exec rename s/c/X/ {} \;

私たちは得るでしょう:

Can't rename /a/b/c.1/c.2/d /a/b/X.1/c.2/d: No such file or directory
Can't rename /a/b/c.1/c.2 /a/b/X.1/c.2: No such file or directory

このメッセージのソースは明確ではありませんが、rename本当です。dまず問題を処理し、renameこれを。たとえば、存在しない場合はこれを行うことはできません。後で(処理中)まだ存在しないのでできません。/a/b/c.1/c.2/d/a/b/X.1/c.2/dmv /a/b/c.1/c.2/d /a/b/X.1/c.2/d/a/b/X.1/c.2/c.2mv /a/b/c.1/c.2 /a/b/X.1/c.2X.1

(基本的に成功しないことを試してみると驚くことがありますrename。コマンドが存在しmv /a/b/c.1/c.2/d /a/b/X.1/c.2/dないと成功しないことに注意してください。成功しても正常に動作します。この場合、デフォルトの動作も正常です。)X.1X.1/c.2/c.1/c.2/rename

この例では、の名前が自動的に変更されるX.1と発生しますが、後で発生します。コマンドの2回目の繰り返しでは、処理中にエラーが発生し、名前を変更しようとします。 3回目の繰り返しでは、何もしないし、何も文句を言わない。c.2X.1dc.2

/c.0notを使用し/a、コマンドがnoの場合、find /c.0/b …norenameは成功し、繰り返し回数は無駄になりません。

問題は、ファイル名ではなくディレクトリコンポーネントにあるにもかかわらず、パスの最初のエントリをrename s/c/X/変更しようとすることです。この問題を解決する方法は少なくとも2つあります。cc


あなたはそれを使用することができますrename -d。このオプションはrenameファイル名でのみ機能します。次のコマンド:

find /c.0/b -depth -exec rename -d s/c/X/ {} \;

成功を(それでも問題ではない)/c.0/b/c.1/c.2/dに変更します。/c.0/b/X.1/X.2/dc.0

-d比較的新しいオプションです。通常はサポートしていrenameない可能性があります。その場合は、-execdir以下を代わりに使用してください-exec

find /c.0/b -depth -execdir rename s/c/X/ {} \;

(通常、findこれをサポートすることもサポートしない場合もあります-execdir。)

うまくいくのは、処理中にd文字列がrename現在処理されているからです。同様に処理する時はでは./dありません。このツールは毎回対応する親ディレクトリで動作するため、相対パスが機能します。文字列にフルパスを含めないと動作しません。/c.0/b/c.1/c.2/dc.2./c.2/c.0/b/c.1/c.2rename -d-d

ほとんど終わりました。renameポイントで何かを実行するには(たとえば、変更c.2など)、c-2処理する必要があるポイントはorです。使用するかどうかにかかわらず、そのような問題はありませんので、可能であれば使用してください。./d./c.2-d-exec-execdirrename -d


最終メモ

問題のコマンドには、-depthおよびが含まれますrename -d。 OPには次のように明確に記載されています。

-depth後でオプションを追加しました[...]

たぶん不足は-depth元の問題かもしれません。しかし:

[追加-detph] 役に立たない

これを考慮し、エラー(Can't rename …)がで発生することを考慮して、エラー()が常に存在するわけではないか、何かが欠けているというrename結論を下しました。今はwithが強力でなければならないと-d思います。 OPが実際に失敗したと仮定すると、まだ説明できません。find -depthrename -d

おすすめ記事