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


14

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

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

mv [*_but_no_dirs] ./other_directory

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

誰もがアイデアを持っていますか?


1
それで、サブフォルダ内のすべてのファイルを移動しますが、サブディレクトリ内のファイルは無視しますか?
ウィルフ14

@Wilf:そのとおりです。
疑問符14

2
zshでは、できます-bashでは、のmv **/*(.) ./other_directoryような外部コマンドに頼る必要がありfindます。
godlygeek 14

回答:


12

ここでは正規表現は関係しません。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修飾子を使用してファイルをタイプ別に一致させることができます。.修飾子は、通常のファイルにマッチします。^/すべての非ディレクトリと一致させるため、またはディレクトリ-^/へのシンボリックリンクを含めるために使用します。

mv -- *(.) other_directory/

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

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

8

次のようなものを使用できます

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

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


2
説明の少し、してください...
Questionmark

1
@Questionmark答えを更新し、説明を追加しました。また、mywiki.wooledge.org / UsingFind
Valentin Bajrami

なぜあなたは提案するのでは-exec sh -c 'mv "$@" MYDIR' _ {} \;なく-exec mv {} MYDIR \;?ただ、変更することにより、合理化することが可能なものを取得する\;には+-exec mv -t MYDIR {} +フォームでそれを行うことができます。
スコット14

@Scott私は-t旗について全く知りませんでした。また、回答の中で説明した+方が高速ですが、すべてのfindバージョンでサポートされているわけではありません。したがって、上記のコードは、find使用されるシェルまたはシェルとほとんど互換性があります。
バレンティンバジラミ14

1
@ val0x00ff:「...上記のコードは任意のものとほとんど互換性があるfindか、使用されているシェル。」確かに、しかしそうであるfind … -exec mv {} MYDIR \;、および使用少ないリソースよりもその… -exec sh -c 'mv "$@" MYDIR' _ {} \;
スコット

0

それは潜在的に少し危険ですが、

cp * destination/
rm *

cpとrmの両方は、-rスイッチなしではディレクトリ上で動作しないためです。


-1

mv *.* destination/destination /を移動先のフォルダーとして単純に実行することをお勧めします。



2
ディレクトリ名は「ドット」を含むことができ、ファイル名はそれを除外することができます(そしてしばしばそうします)*.*
dave_thompson_085 16

申し訳ありませんが、これは完全に間違っています。名前にドットが含まれているものはすべて移動し、ドットのないものは移動しません。ドットはファイル専用ではなく、ファイルにも必要ではないため、ファイルとディレクトリのランダムな選択を移動するだけです。
テルドン

-2
mv $(ls -l | grep "^-" | awk '{print $9}') ./folder_where_move
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.