web-dev-qa-db-ja.com

ディレクトリではないすべてのファイルを移動する

ファイルとサブディレクトリの両方を含む、整理しようとしているディレクトリがあります。私がやろうとしていることは簡単です。すべてのファイルを別のディレクトリに移動しますが、すべてのサブディレクトリはそのままにしておきます。

私は次のようなことを考えています:

mv [*_but_no_dirs] ./other_directory

ワイルドカード*と正規表現でこれを行う簡単な方法があるはずです...

誰かアイデアはありますか?

16
Questionmark

ここでは正規表現は関係しません。 bashのワイルドカード(他のほとんどのシェルと同様)は、ファイルタイプやその他の特性に基づくのではなく、ファイル名に基づくファイルにのみ一致します。タイプごとに照合する方法が1つあります。パターンの最後に/を追加すると、ディレクトリまたはディレクトリへのシンボリックリンクのみが照合されます。この方法では、ディレクトリを移動してから、残っているものを移動したり、ディレクトリを元に戻したりできます。面倒ですが、機能します。

tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"

タイプでファイルを照合する標準的な方法は、 find を呼び出すことです。

find . -name . -o -type d -Prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +

Zshでは、 glob qualifiers を使用して、タイプごとにファイルを照合できます。 .修飾子は通常のファイルと一致します。 ^/を使用してすべての非ディレクトリを照合するか、-^/を使用してディレクトリへのシンボリックリンクも含めます。

mv -- *(.) other_directory/

どのシェルでも、単純にループできます。

for x in *; do
   if ! [ -d "$x" ]; then
     mv -- "$x" other_directory/
   fi
done

あなたは次のようなものを使うことができます

find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv  "$@" MYDIR' _ {} \;

まずfindを使用して現在のディレクトリ内のみを検索し、次に! -type dを使用してディレクトリを無視し、最後にshを実行してすべてを宛先ディレクトリに移動します。最後に{} +を試してみると、より高速になります。

9

mv $(find /my/source/directory -maxdepth 1 -type f) /my/destination/directory

Moveは引数のリストを取得するため、find/my/source/directory内の「ファイル」タイプのすべてを提供するように要求すると、それらは1つずつ/my/destination/directoryに移動します。サブディレクトリにもファイルを含める場合は、ディレクトリ構造をそのままにして、上記のコマンドから-maxdepth 1を削除します。

0
enharmonic

少し危険かもしれませんが

cp * destination/
rm *

Cpとrmはどちらも、-rスイッチがないとディレクトリを操作できません。

0
miick