Saya menyalin beberapa file dari folder sumber ke folder tujuan dengan menggunakan perintah di bawah ini di terminal.
sudo cp From_SOURCE/* To_DESTINATION/
Sekarang saya ingin membatalkan perintah ini.
command-line
cp
αғsнιη
sumber
sumber
From_SOURCE/*
, dan menghapusnya dariTo_DESTINATION/
; ini bisa dilakukan dengan bash - masalah di sini dapat mencakup perintah cp menimpa apa pun, symlink disalin, file dengan spasi dalam nama, dll - sehingga bisa memiliki masalah dan agak aneh. Opsi 'undo' yang sempurna mungkin harus memperhitungkan banyak hal.Jawaban:
Jika saya mengerti dengan baik, berikut ini kasusnya:
Skrip di bawah ini terlihat di direktori (sumber) asli dan mencantumkan file-file itu. Kemudian ia melihat ke direktori tempat Anda menyalin file, dan hanya menghapus file yang terdaftar, seperti yang ada di direktori sumber.
The
try
elemen ditambahkan untuk mencegah kesalahan, misalnya dalam kasus Anda mungkin telah menghapus beberapa file secara manual sudah, atau jika tidak semua file dari direktori sumber disalin ke tujuan. Jika Anda membutuhkan hak sudo, cukup jalankan skrip dengan "sudo" (lihat di bawah).Naskah
Cara Penggunaan
reverse.py
,Jalankan dengan perintah:
Peringatan
Pertama coba di direktori tes jika saya mengerti dengan baik apa yang perlu Anda capai!
Jika direktori sumbernya adalah "flat"
Jika direktori sumber tidak memiliki sub-direktori, skrip bahkan dapat lebih sederhana:
Catatan
Jika tindakan salin menimpa (diganti) file dengan nama yang sama di tujuan, file tersebut akan dihapus, tetapi file asli tidak akan dikembalikan oleh skrip. Asumsinya adalah tidak ada bentrokan nama.
sumber
sudo python3 reverse.py
. Saya menerima jawaban Anda.cp
.cp -r
. Saya berubahos.remove
denganprint
, dan itu menghasilkan banyak file yang tidak ada. Saya menganggap itu hilang subdirektori, dan hanya daftar file di akhir.TL; DR:
Semua file yang ada di keduanya
src
dandest
dapat dihapus daridest
seperti ini:Untuk langkah demi langkah, penjelasan, lihat di bawah.
Menyederhanakan masalah:
Untuk memahami apa yang sebenarnya ingin kami batalkan, kami mulai dengan menyederhanakannya:
Perintah yang ingin kita batalkan adalah
Untuk memahami cara membatalkan,
sudo
tidak relevan.Saya akan menggunakan nama direktori
src
untukFrom_SOURCE
dandest
untukTo_DESTINATION
.Sekarang, perintah kami adalah:
Jika
src
berisi filef1
,f2
danf3
, dan direktorid1
dand2
, shell memperluas perintah itu ke:Tanpa opsi seperti
-r
,-R
atau-a
, perintahcp
tidak menyalin direktori.Itu berarti, perintah akan membiarkan mereka keluar, menunjukkan kesalahan untuk masing-masing dari mereka:
Itu berarti, kami hanya menyalin file sederhana, dan tidak ada direktori, ke
dest
.Memutuskan file mana yang akan dihapus:
Mungkin ada file
dest
dengan nama yang sama dengan file dalamsrc
. Dalam hal ini, file-file tersebut ditimpa (1). Sudah terlambat bagi mereka, maaf. Dapatkan mereka kembali dari cadangan terbaru.Mengenai file yang ada di sana, kami hanya ingin menghapus file yang sudah disalin. File-file ini ada di kedua direktori, dengan nama yang sama, dan konten yang sama.
Jadi kami mencari file-file ini:
Pertama, kita
cd
masuksrc
, karena itu membuatfind
perintah berikut lebih sederhana, dan menetapkan variabel ke jalur absolut dest:Lalu, kami daftar semua file di src:
dan, untuk setiap file yang ditemukan, gunakan
cmp
untuk memeriksa apakah ada file dengan konten yang sama di dest:Menghapus file, dengan hati-hati:
File-file ini adalah yang ingin kita hapus. Namun yang pasti, kami memindahkannya ke direktori yang berbeda terlebih dahulu - dan perhatikan perintah sebelum menjalankannya:
Kelihatan bagus! Sekarang kita bisa membiarkan
echo
untuk menjalankanmv
perintah nyata :Semua file dari
dest
yang disalin darisrc
, dan masih benar-benar samasrc
dandest
, sekarang/tmp/toDelete/
, dan dapat dihapus setelah melihat terakhir.Catatan:
(1) Periksa apakah
cp
aliascp -i
atau lebih, yang akan mencegah menimpa file dengan bertanya terlebih dahulu.sumber
Ini sudah tua, tetapi saya hanya ingin memposting jawaban bash murni:
Pertama, ubah ke direktori tempat Anda menyalin file.
cd dest
Lalu,
ls
direktori sumber dan pipa output kerm
ls source | xargs rm
sumber
ls
biasanya ide yang buruk. mywiki.wooledge.org/ParsingLs Saya tidak akan mengunggah posting Anda, tetapi harus dicatat.