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


回答:


12

フォルダーの内容を再帰的にコピーする場合(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

これは、sub /が空でない場合は機能しません-> subが再びsubにコピーされます(@Oguzが望んでいない場合を除く)。

OK、私はついにfindコードに満足しています:D
Lekensteyn

2
2番目のコマンドは、スペースを含むファイル名に対して失敗します。xargsまたはを使用し-execます。必要なしgrep-使用! -name "$TARGETDIR"または類似。の周りに比類のない引用符があり$fileます。再帰cpは、最初のコマンド以外では意図したとおりに機能するとは思わない。
追って通知があるまで一時停止します。

Wohaa、最後のコードの引用を逃しました。良いコメントデニス、この場合-nameを使用することを考えたことがありませんでした:)
Lekensteyn

4

仮にはtargetあなたのシェルがbashのであれば、ターゲットサブディレクトリの名前です。

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/ます。


2

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

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


0

これはあなたのために働きますか?

cp -r * subdir/

現在のディレクトリのすべてをサブディレクトリにコピーする代わりに移動する場合は、次のようにします。

mv * subdir/

これは、非空のディレクトリの世話をしない

私はちょうどテストしました、そして、それは働きました。
カールフィリップ

@Lekensteynが提案したように、空でないディレクトリを再帰的にコピーする必要があります。

-1

これにより、ターゲットディレクトリ自体を含まないドットファイルを含むすべてがターゲットディレクトリにコピーされますSUBDIR

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done

2
スペースを含むファイル名では失敗します。
追って通知があるまで一時停止します。

-1

これは、たとえばdirCopy.shファイルに含まれます



for i in `ls`
do
        if [ $i != "subDir" ]
        then
                `cp -r $i subDir`
        fi
done

コンソールで「sh dirCopy.sh」として実行します


2
必要ありませんlsfor file in *。バックティックは不要です-を使用します$()。コマンドの$()周りにバックティック(または)が不要です(cpエラーメッセージが生成されます)。
追って通知があるまで一時停止します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.