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

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

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

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

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

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

おすすめ記事