ディレクトリ以外のすべてのファイルを移動します。

ディレクトリ以外のすべてのファイルを移動します。

ファイルとサブディレクトリを含むディレクトリをクリーンアップしようとしています。私が望むのは簡単です。すべてのファイルを別のディレクトリに移動しますが、すべてのサブディレクトリは変更せずに残します。

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

mv [*_but_no_dirs] ./other_directory

*ワイルドカードと正規表現を使用してこれを行う簡単な方法が必要です。

誰でもどんなアイデアがありますか?

答え1

これには正規表現は含まれません。 Bashのワイルドカード(他のほとんどのシェルと同様)は、タイプやその他の属性ではなく、名前のみに基づいてファイルを照合します。タイプ別に一致させる方法があります。/ディレクトリまたはディレクトリのみが一致するように、パターンの末尾にシンボリックリンクを追加します。この方法では、ディレクトリを移動し、残りのディレクトリを移動して、ディレクトリを再度移動できます。面倒ですが効果的です。

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

(現在のディレクトリがファイルシステムのマウントポイントである場合は、このアプローチを避ける必要があります。これは、ディレクトリを外に移動するか後に移動する場合は、その中のすべてのデータを2回コピーする必要があるためです。)

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

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

(シンボリックリンクもディレクトリを指しているかどうかにかかわらず移動されます。)

zshでは利用可能ですグローバル予選タイプ別にファイルを照合します。修飾子は、ディレクトリ以外のすべてのエントリを一致させるか、ディレクトリへのシンボリックリンクを除外するために.使用される一般的なファイルと一致します。^/-^/

mv -- *(.) other_directory/

どのシェルでも簡単に繰り返すことができます。

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

(シンボリックリンクはディレクトリに移動されません)。

答え2

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

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

まず、find現在のディレクトリだけを見てから、! -type d finallyを使用してディレクトリを無視し、すべてを実行してshターゲットディレクトリに移動します。{} +最後に試してみると速くなります。

答え3

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

cp * destination/
rm *

-r スイッチがなければ、cp や rm をディレクトリで実行できないからです。

答え4

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

findMoveは引数リストを使用するため、フィードから「ファイル」タイプのすべてのコンテンツを要求すると/my/source/directory1つずつ移動します/my/destination/directory。ディレクトリ構造を変更せずにサブディレクトリにファイルを含めるには、上記のコマンドから-maxdepth 1ファイルを削除します。

関連情報