回答:
{}fromを削除するとmv、mv親ディレクトリを無視してそれをターゲットディレクトリとして取得します。
find -type f -exec mv {} collection/ \;
-maxdepth 1が役立つでしょう。
find -type f -print0|xargs -0r mv -it colection/
find(うまくいく)を使う代わりに、この目的のためにシェルを使うこともできます。
$ PWDから$ DESTまでのすべてのファイルが必要だとします。自然な試みは次のとおりです。
mv $PWD/* $DEST
これはどのように作動しますか?「$ PWD / *」という表現は、そのディレクトリ内のすべてのファイルの名前に展開されます。このシェル機能は「グロビング」と呼ばれます。の最後の引数mvは宛先ディレクトリです。ファイルが非常に多い場合、コマンドラインの長さが制限されているため、これは機能しません。
しかし、解決策には、ドットファイル、または名前が「。」で始まる「非表示」ファイル、ファイル、およびディレクトリが省略されるという問題があります。これを解決するには、グロビング時にドットファイルを含めるようにシェルに指示する必要があります。これを行うには、
shopt -s dotglob
使用するときbash(そしてbash、デフォルトを変更していない限り、おそらく使用します)。このシェルでは、上記のコマンドはドットファイルでも機能します。
余談zshですが、では、ケースバイケースでこれを選択するオプションがあります。これを行うには、
setopt extendedglob
あなたの.zshrc。その後、使用できます
mv $PWD/*(D) $DEST
dotfilesを含むすべてのファイルを移動します。(「D」には、「GLOB_DOTS」オプションを一時的に有効にする効果があります)。
元の問題は、すべての通常のファイル(ディレクトリではない)をすべてのサブディレクトリとそのサブディレクトリから単一のディレクトリに移動することでした。これは次の方法で実現できますzsh。
mv $PWD/**/*(D.)
ここでは、式**/*はglobberをサブディレクトリに再帰的に下降させます。D「dotfilesも選択する」という意味、「.ディレクトリではなく、通常のファイルのみを選択する」という意味です。
find -type f -exec mv -t collection/ {} +。これがどのように機能するかについては、マニュアルページを参照してください。