ファイルとサブディレクトリの両方を含む、整理しようとしているディレクトリがあります。私がやろうとしていることは簡単です。すべてのファイルを別のディレクトリに移動しますが、すべてのサブディレクトリはそのままにしておきます。
私は次のようなことを考えています:
mv [*_but_no_dirs] ./other_directory
ワイルドカード*
と正規表現でこれを行う簡単な方法があるはずです...
誰かアイデアはありますか?
ここでは正規表現は関係しません。 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
を実行してすべてを宛先ディレクトリに移動します。最後に{} +
を試してみると、より高速になります。
mv $(find /my/source/directory -maxdepth 1 -type f) /my/destination/directory
Moveは引数のリストを取得するため、find
に/my/source/directory
内の「ファイル」タイプのすべてを提供するように要求すると、それらは1つずつ/my/destination/directory
に移動します。サブディレクトリにもファイルを含める場合は、ディレクトリ構造をそのままにして、上記のコマンドから-maxdepth 1
を削除します。
少し危険かもしれませんが
cp * destination/
rm *
Cpとrmはどちらも、-rスイッチがないとディレクトリを操作できません。