基本的に、私のハードドライブはめちゃくちゃで、メインディレクトリに200以上のサブディレクトリがあります。基本的に、拡張子が.txt
などの200以上のサブディレクトリにあるすべてのファイルを新しいディレクトリに移動したいと思います。たとえば、n00b.txt
またはn00b.txt.exe
したがって、200以上のサブディレクトリSudo mv **/*.txt ~/Desktop/tmpremo/
で構成されるメインディレクトリで次のコマンドを試します。
代わりに次のエラーが発生します:bash: /usr/bin/Sudo: Argument list too long
なぜそれを取得しているのですか、また.txt,.txt.exe
を削除するにはどうすればよいですか?どうすれば修正できますか?
これにより、.txt
および.txt.exe
拡張子が付いたすべてのファイルが、現在のディレクトリ内(サブディレクトリ内も含む)のどこかに~/Desktop/tmpremo
に移動します。
$ Sudo find . -type f \( -iname '*.txt' -o -iname '*.txt.exe' \) -exec mv {} ~/Desktop/tmpremo \;
別の拡張機能も必要な場合は、-o -iname '*.extension'
の前に-exec
を追加するだけです。
PS:@xenoidが述べたように、Sudo
は、当面のタスクで絶対に必要でない限り、使用しないでください。
すでに_**
_を使用しているので、単純なループを実行してみませんか?
_for name in ./**/*.txt ./**/*.txt.exe; do
mv "$name" "$HOME/Desktop/tmpremo"
done
_
_Argument list too long
_エラーは、シェルが多すぎる/長い引数でコマンドを実行しようとしたために発生します。これは、Cライブラリ関数のexec()
ファミリの1つの制限であり、引数の長さとすべての環境変数の合計サイズの合計に制限があります(Linuxでは、少し複雑です)各引数の最大許容長さも私は信じていますが、それは詳細です)。
エラーメッセージから、bash
を使用していることがわかりますが、zsh
ユーザーで、GNU mv
を使用している場合、代わりにできる
_autoload -U zargs
zargs -- ./**/*.txt(.) ./**/*.txt.exe(.) -- mv -t "$HOME/Desktop/tmpremo"
_
zargs
ユーティリティはxargs
に少し似ていますが、ロード可能なzsh
シェル関数として実装されています。これをロードする_zargs --help
_とzshcontrib(1)
マニュアルを参照してください。
(ここでは初心者なので、@ 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」は「foo/bar.txt」引数を持つコマンドecho
ではありません。これは、コマンドがシステムに見つからないためです。 echo foo/bar.txt
という名前のシステム。
これが、BarBar1234が回答を編集して、単一引用符を削除した理由です。 echo
は、この場合は文字列ではなくコマンドとして扱われることになっています。
**/*.txt
が非常に長いコマンドラインとして一致するすべてのファイル(フルパスを含む)で展開され、引数の長さに制限があるため、エラーが発生します。
find ... -exec mv
の使用に関する問題は、ファイルごとにmv
を1回実行することです。
引数の最大許容数でコマンドを実行しようとするコマンドがあります:xargs
、つまりfind
の出力をxargs
にパイプし、xargs
にmv
を実行するように通知する必要があります(引数はデフォルトで末尾に追加されます)。
find . -type f -name '*.txt' -print0 | xargs -0 mv -t ~/Desktop/tmpremo
PS:Sudo
を使用して自分のユーザーディレクトリ内にファイルを移動する必要があることに驚いています。
トップレベルのディレクトリからこれを試してください。サブディレクトリはここにあります:
Sudo find . -type f -iname '*.txt' -exec echo {} \;
見つかったファイルのリストに問題のテキストファイルのリストが表示されている場合は、次の操作を行います。
Sudo find . -path ~/Desktop/tmpremo -Prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;