同じファイル拡張子が.txtのすべてのファイルを新しいディレクトリに移動します。

同じファイル拡張子が.txtのすべてのファイルを新しいディレクトリに移動します。

デフォルトでは、私のハードドライブにはデフォルトディレクトリ内に200以上のサブディレクトリがあり、混乱しています。.txt200以上のサブディレクトリにある拡張子などを含むすべてのファイルを新しいディレクトリに移動したいと思います。たとえば、n00b.txtまたはn00b.txt.exe

そのため、200を超えるサブディレクトリを含むホームディレクトリで次のコマンドを試しました。sudo mv **/*.txt ~/Desktop/tmpremo/

代わりに、次のエラーが発生します。bash: /usr/bin/sudo: Argument list too long

このメッセージが表示されるのはなぜですか、sayを削除するにはどうすればよいですか.txt,.txt.exe?どうすれば解決できますか?

答え1

これにより、現在のディレクトリ(サブディレクトリを含む)内のどこにも存在する拡張子を持つすべてのファイルが.txt.txt.exe~/Desktop/tmpremo

$ sudo find . -type f \( -iname '*.txt' -o -iname '*.txt.exe' \) -exec mv {} ~/Desktop/tmpremo \;

他の拡張も必要に応じて-o -iname '*.extension'追加できます-exec

sudoPS:@xenoidが指摘したように、現在の作業で絶対に必要な場合以外は使用しないでください。

答え2

(ここでは初心者なので@BarBar1234の回答について言及できません)

私はコマンド自体がすでに見つかったファイル名をエコーするので、「find」の出力をエコーする必要はないと思います。

したがって、次のものを使用できます。

sudo find . -type f -iname '*.txt'

ただし、知識のためにfind: ‘echo ./rdggt_169/frretcdd_td.txt ’: No such file or directoryコマンドで()結果が発生します。

sudo find . -type f -iname '*.txt' -exec 'echo {}'  \;

言う部分は-exec 'echo {}'一重引用符引数を提供する-execことなので、拡張文字列全体をコマンドとして扱います。

明確に言えば、文字列 'echo foo/bar.txt' は引数echo'foo/bar.txt' を持つコマンドではありません。したがって、コマンドと呼ばれるシステムには存在しないため、システムには何も見つかりませんecho foo/bar.txt

これが BarBar1234 が一重引用符を削除するために回答を編集した理由です。 Now は、echoこの場合処理する内容で、文字列ではなくコマンドとして処理されます。

答え3

**/*.txt一致するすべてのファイル(フルパスを含む)が非常に長いコマンドラインに展開され、引数の長さに制限があるため、エラーが発生します。

これを使用するときの問題の1つは、find ... -exec mvファイルごとに1回実行されることです。mv

許容される引数の最大数を使用してコマンドを実行しようとするコマンドがあるため、出力をパイプしてxargs実行するように指示します(引数はデフォルトで最後に追加されます)。findxargsxargsmv

find . -type f -name '*.txt' -print0 | xargs -0 mv -t ~/Desktop/tmpremo

sudoPS:自分のユーザーディレクトリでファイルの移動を使用する必要があることに驚きました。

答え4

これを試してみてくださいトップレベルディレクトリサブディレクトリの場所:

sudo find . -type f -iname '*.txt' -exec echo {}  \;

見つかったファイルのリストに問題のあるテキストファイルのリストが表示されたら、次の手順を実行します。

sudo find . -path ~/Desktop/tmpremo -prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;

関連情報