Saat saya gunakan
cp -R inputFolder outputFolder
hasilnya tergantung pada konteks :
- jika
outputFolder
tidak ada, itu akan dibuat, dan jalur folder yang dikloning akanoutputFolder
. - jika
outputFolder
ada, maka klon yang dibuat akan menjadioutputFolder/inputFolder
Ini mengerikan , karena saya ingin membuat beberapa skrip instalasi, dan jika pengguna menjalankannya dua kali secara tidak sengaja, ia akan outputFolder
membuat yang pertama kali, maka pada proses kedua semua hal akan dibuat sekali lagi di Windows outputFolder/inputFolder
.
- Saya ingin selalu perilaku pertama: buat klon di sebelah yang asli (sebagai saudara kandung).
- Saya ingin menggunakan
cp
untuk menjadi portabel (mis. MINGW tidakrsync
mengirim) - Saya memeriksa
cp -R --parents
tetapi ini membuat ulang jalan sampai pohon direktori (jadi klon tidak akanoutputFolder
tetapisome/path/outputFolder
) --remove-destination
atau--update
dalam kasus 2 tidak mengubah apa pun, masih ada hal-hal yang disalinoutputFolder/inputFolder
Apakah ada cara untuk melakukan ini tanpa terlebih dahulu memeriksa keberadaan outputFolder
(jika folder tidak ada maka ...) atau menggunakan rm -rf outputFolder
?
Apa cara UNIX portabel yang disetujui untuk melakukan itu?
mv
memindahkan kumpulan file menjadi satu file biasa?rsync
?cp
, perpipaan di antara duatar
perintah adalah cara yang andal dan bagus untuk menyalin pohon.rsync
dikirim.tar -C input -cf - . | tar -C output -xf -
berfungsi.-C
mengubah direktori kerja, tetapi ini bukan opsi standar, jadi jika itu tidak didukung, Anda perlu menjalankan dua ter di direktori kerja yang benar untuk memulai, misalnya.( cd input && tar -cf - . ) | ( cd output && tar -xf - )
Namun jika Anda berurusan dengan Windows, saya hanya akan menggunakan jawaban roaima.Jawaban:
Gunakan ini sebagai gantinya:
Ini bekerja persis dengan cara yang sama, katakanlah,
cp -R aaa/bbb ccc
berfungsi: jikaccc
tidak ada maka itu dibuat sebagai salinanbbb
dan isinya; tetapi jikaccc
sudah ada makaccc/bbb
dibuat sebagai salinanbbb
dan isinya.Untuk hampir semua contoh dari
bbb
ini memberikan perilaku yang tidak diinginkan yang Anda catat dalam Pertanyaan Anda. Namun, dalam situasi khususbbb
ini.
, hanya , begituaaa/bbb
juga sebenarnyaaaa/.
, yang pada gilirannya benar-benar hanyaaaa
dengan nama lain. Jadi kami memiliki dua skenario ini:ccc
tidak ada:Perintah itu
cp -R aaa/. ccc
berarti "membuatccc
dan menyalin isiaaa/.
keccc/.
, yaitu menyalinaaa
keccc
.ccc
memang ada:Perintah itu
cp -R aaa/. ccc
berarti "salin isiaaa/.
keccc/.
, yaitu salinaaa
keccc
.sumber
inputFolder/.
bukannyainputFolder
itu benar-benar bekerja untuk saya di Windows / Git Bash. (Namun tidak berfungsi hanya dengan trailing/
, saya perlu juga titik setelah slash). Saya memberi +1 karena ini menarik, meskipun mungkin agak sulit untuk menggunakannya dalam kode publik :)Jangan salin foldernya, salin isinya saja:
Dengan cara ini Anda berdua memastikan bahwa direktori target dibuat pertama kali skrip berjalan dan menghindari masalah saat menjalankannya kedua kalinya.
Chris Down dengan sangat tepat menunjukkan bahwa dalam bash, ini akan melewatkan file yang namanya dimulai dengan a
.
. Untuk menghindari ini, Anda dapat menjalankanshopt -s dotglob
sebelum menjalankan perintah di atas.Baik
-p
untukmkdir
dan-R
untukcp
didefinisikan oleh POSIX jadi ini harus portabel.sumber
.
. Dalam bash, Anda dapat menggunakannyadotglob
untuk itu.Coba
-T
opsi untukcp
. Ini ada di GNU coreutilscp
versi 8.22; mungkin tidak portabel di luar itu.sumber
cp -T
(cp --no-target-directory
). unix.stackexchange.com/questions/94831/... Sayangnya versi sayacp
jauh lebih tua.-u
adalah pilihan yang bagus untuk membuatnya malas.Anda juga bisa menggunakan
rsync
:(perhatikan garis miring, terutama setelah yang pertama)
sumber
Menurut pendapat saya, tidak ada yang lebih sederhana dan lebih portabel daripada
rm -rf outputFolder
. Jadi, saya selalu bertahan dengan itu. Saya mengerti bahwa pertanyaan Anda berbeda, tetapi saya pikir ini adalah praktik terbaik.sumber
cp
sama, baik ketika direktori tidak ada dan kapan ada. Jadi, apa yang kamu bicarakan?cp
perintah seperti yang diberikan oleh OP tidak menyimpan izin (atau cap waktu).Anda dapat menggunakan
-t
opsicp
perintah sebagai:sekarang jika folder target tidak ada itu akan menimbulkan kesalahan:
Catatan di atas perintah akan menyalin
inputFolder
beserta isinya (dan bukan hanya isinya)jika Anda ingin menyalin hanya isi
inputFolder
itu agak rumit (karena Anda harus berhati-hati saat menggunakan shell globbing saat menggunakan tanda bintang *)sekarang jika folder target tidak ada itu akan menimbulkan kesalahan:
bekerja dengan
cp (GNU coreutils) 8.23
sumber