デフォルトでは、私のハードドライブにはデフォルトディレクトリ内に200以上のサブディレクトリがあり、混乱しています。.txt
200以上のサブディレクトリにある拡張子などを含むすべてのファイルを新しいディレクトリに移動したいと思います。たとえば、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
。
sudo
PS:@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
実行するように指示します(引数はデフォルトで最後に追加されます)。find
xargs
xargs
mv
find . -type f -name '*.txt' -print0 | xargs -0 mv -t ~/Desktop/tmpremo
sudo
PS:自分のユーザーディレクトリでファイルの移動を使用する必要があることに驚きました。
答え4
これを試してみてくださいトップレベルディレクトリサブディレクトリの場所:
sudo find . -type f -iname '*.txt' -exec echo {} \;
見つかったファイルのリストに問題のあるテキストファイルのリストが表示されたら、次の手順を実行します。
sudo find . -path ~/Desktop/tmpremo -prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;