Menyalin isi direktori saat ini ke subdirektori

13

Bagaimana saya bisa menggunakan terminal Linux untuk menyalin semua yang ada di direktori saat ini ke subdirektori?

Oguz Bilgic
sumber
Apakah maksud Anda menyalin atau memindahkan?
Craig

Jawaban:

12

Jika Anda ingin menyalin konten folder secara rekursif (akan menimbulkan 1 kesalahan, alternatif di bawah):

cp -r * sub/

Sedikit lebih meretas, tetapi bekerja pada subdirektori tidak kosong:

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

Oneliner lain:

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

Atau rekursif:

TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
Lekensteyn
sumber
ini tidak berfungsi jika sub / tidak kosong -> sub akan disalin ke sub lagi, kecuali kalau itu yang diinginkan oleh @Oguz.
Ok saya akhirnya puas dengan findkode: D
Lekensteyn
2
Perintah kedua Anda gagal untuk nama file yang menyertakan spasi. Gunakan xargsatau -exec. Tidak perlu untuk grepdigunakan ! -name "$TARGETDIR"atau serupa. Anda memiliki penawaran yang tidak cocok di sekitar $file. Saya tidak berpikir rekursif cpakan bekerja seperti yang Anda inginkan kecuali perintah pertama Anda.
Dijeda sampai pemberitahuan lebih lanjut.
Wohaa, melewatkan kutipan dalam kode terakhir. Komentar yang bagus Dennis, saya tidak pernah berpikir untuk menggunakan -nama dalam kasus ini :)
Lekensteyn
4

Misalkan targetadalah nama subdirektori target, jika shell Anda adalah bash:

shopt -s extglob
cp -r !(target) target/

Di ksh, Anda bisa langsung melakukannya cp -r !(target) target/.

Dalam zsh, Anda dapat melakukan setopt ksh_globitu cp -r !(target) target/. Kemungkinan lain adalah setopt extended_globkemudian cp -r ^target target/.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Saya akan menyarankan memindahkan direktori target di luar direktori sumber dan kemudian memasukkannya kembali; mv adalah gratis (jika Anda berhati-hati untuk tidak pindah ke sistem file yang berbeda), kecuali jika Anda mengharapkan proses lain untuk mengganggu / terganggu.

Sebagian besar solusi yang diposting di atas tidak akan berfungsi jika ada spasi dalam nama file. Saya akan menyarankan menggunakan varian find -print0 | xargs -0, atau temukan -exec, dll.

alex
sumber
0

Apakah ini akan berhasil untuk Anda?

cp -r * subdir/

Jika Anda bermaksud memindahkan alih-alih menyalin segala sesuatu di direktori saat ini ke subdirektori, Anda dapat melakukan:

mv * subdir/
karlphillip
sumber
ini tidak menangani direktori yang tidak kosong
Saya baru saja menguji, dan itu berhasil.
karlphillip
Anda perlu menyalin direktori tidak kosong secara rekursif seperti yang disarankan @Lekensteyn.
-1

Ini akan menyalin semuanya, termasuk file dot, dan tidak termasuk direktori target itu sendiri, ke direktori target SUBDIR:

for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
ivern
sumber
2
Gagal untuk nama file yang menyertakan spasi.
Dijeda sampai pemberitahuan lebih lanjut.
-1

Ini berlaku sebagai file dirCopy.sh



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

jalankan sebagai "sh dirCopy.sh" di konsol Anda

Rahul
sumber
2
Tidak ada kebutuhan untuk ls: for file in *. Tidak perlu untuk backticks - gunakan $(). Tidak perlu untuk backticks (atau $()) di sekitar cpperintah (yang akan menghasilkan pesan kesalahan).
Dijeda sampai pemberitahuan lebih lanjut.