web-dev-qa-db-ja.com

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

基本的に、私のハードドライブはめちゃくちゃで、メインディレクトリに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を削除するにはどうすればよいですか?どうすれば修正できますか?

3
n00bl1nux

これにより、.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は、当面のタスクで絶対に必要でない限り、使用しないでください。

1

すでに_**_を使用しているので、単純なループを実行してみませんか?

_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)マニュアルを参照してください。

1
Kusalananda

(ここでは初心者なので、@ 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は、この場合は文字列ではなくコマンドとして扱われることになっています。

1
Teodoro Mendes

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

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

引数の最大許容数でコマンドを実行しようとするコマンドがあります:xargs、つまりfindの出力をxargsにパイプし、xargsmvを実行するように通知する必要があります(引数はデフォルトで末尾に追加されます)。

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

PS:Sudoを使用して自分のユーザーディレクトリ内にファイルを移動する必要があることに驚いています。

1
xenoid

トップレベルのディレクトリからこれを試してください。サブディレクトリはここにあります:

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

見つかったファイルのリストに問題のテキストファイルのリストが表示されている場合は、次の操作を行います。

Sudo find . -path ~/Desktop/tmpremo -Prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;
0
BarBar1234