web-dev-qa-db-ja.com

現在のディレクトリの内容をサブディレクトリにコピーする

Linuxターミナルを使用して、現在のディレクトリのすべてをサブディレクトリにコピーするにはどうすればよいですか?

13
Oguz Bilgic

フォルダーの内容を再帰的にコピーしたい場合(1つのエラーがスローされますが、以下の代替案):

cp -r * sub/

もう少しハッキーですが、空ではないサブディレクトリで動作します:

TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"

別のワンライナー:

TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done

または再帰:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
12
Lekensteyn

シェルがbashの場合、targetがターゲットサブディレクトリの名前だとします。

_shopt -s extglob
cp -r !(target) target/
_

Kshでは、直接cp -r !(target) target/を実行できます。

Zshでは、_setopt ksh_glob_、次にcp -r !(target) target/を実行できます。別の可能性は、_setopt extended_glob_の次に_cp -r ^target target/_です。

ターゲットディレクトリをソースディレクトリの外に移動してから、元に戻すことをお勧めします。 mvは無料です(別のファイルシステムに移動しないように注意している場合)。ただし、他のプロセスが干渉する/干渉されることを予期している場合を除きます。

上記のほとんどの解決策は、ファイル名にスペースが含まれていると機能しません。 find -print0のバリアントを使用することをお勧めします| xargs -0、またはfind -execなど。

2
alex

これでうまくいきますか?

cp -r * subdir/

現在のディレクトリのすべてをサブディレクトリにコピーする代わりに移動するつもりなら、次のようにすることができます:

mv * subdir/
0
karlphillip