Batch mengubah nama / menggabungkan banyak direktori

3

Ini mungkin cukup mudah, tetapi apa cara terbaik untuk mengubah nama semua direktori bernama "A" menjadi "B" secara rekursif di bawah direktori dasar tanpa mengikuti tautan simbolis dan menggabungkan konten direktori yang bertentangan menjadi satu? Artinya, jika direktori "B" sudah ada, maka konten "A" harus dipindahkan ke "B", dan direktori "A" yang kosong dihapus.

Alex Reinking
sumber
Saya tidak memiliki jawaban pasti yang dapat saya konfirmasi karena saya menggunakan Windows tetapi sesuatu seperti ini mungkin merupakan titik awal yang baik untuk Anda jika tidak ada yang lain ... find "/C/Users/User/Desktop/a" -depth -type d -name "\a" -execdir mv -T -f "{}" "./b" \; Anda mungkin dapat menempatkan perintah RENAME sebagai pengganti perintah MV atau sesuatu. Saya tidak bisa mendapatkannya untuk menelusuri semua folder seolah-olah tidak memiliki izin untuk mengubah nama beberapa tapi itu sedekat yang saya bisa dapatkan sebelum saya kehabisan waktu.
Pimp Juice IT

Jawaban:

0

Tidak ada satu pun program yang melakukan fungsi rename / merge mv ... -t ... akan sangat membantu jika bisa lebih mudah digunakan dalam find perintah. Jadi yang saya rencanakan adalah:

find BaseDir/ -type d -name "A" | sort -r | while read d; \
     do [ -d "${d%A}B" ] && mv "$d"/* "${d%A}B"/ && rmdir "$d" || \
         mv "$d" "${d%A}B"; done

Apa yang dilakukan adalah: -

  • Temukan semua direktori dengan nama A.
  • Membalik urutan sehingga, misalnya, BaseDir/A/A akan diganti namanya sebelumnya BaseDir/A: jika yang terakhir diganti namanya terlebih dahulu, yang pertama tidak akan ditemukan selanjutnya.
  • Langkah melalui setiap direktori yang ditemukan: jika B tidak ada, mengubah nama sederhana berfungsi; jika tidak, isi dari A dipindahkan ke B dan sekarang kosong A dapat dihapus.

Perhatikan bahwa jika B sudah ada, semua file yang ada di dalamnya akan ditimpa oleh file dengan nama yang sama di A: Anda mungkin ingin menambahkan perintah tambahan untuk mencegah ini - Anda bisa menggunakan mv -i, tetapi Anda perlu membangun kembali terminal untuk segala permintaan (mis mv </dev/stdin -i ..., atau apa pun yang didukung oleh Linux Anda), karena stdin telah dialihkan ke skrip.

Saya telah menggunakan tanda kutip untuk mengizinkan bagian yang kosong di salah satu elemen jalur, termasuk A dan B.

Saya telah mencoba menguji hierarki yang berbeda, tetapi saya tidak dapat memastikan bahwa saya telah membahas semua struktur yang mungkin Anda gunakan. Saya sarankan Anda meletakkan echo sebelum mv dan rmdir perintah terlebih dahulu, sampai Anda memverifikasi bahwa perintah itu melakukan apa yang Anda inginkan.

AFH
sumber