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.
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.