Saya memiliki jenis pohon direktori yang diperoleh dari membuka ritsleting file zip:
x -> y -> z -> run -> FILE DAN DIREKTUR DI SINI
Jadi ada 4 direktori, 3 di antaranya kosong dari file (x, y, z) dan hanya berisi 1 sub-direktori, dan ada direktori yang saya minati, bernama " run ".
Saya ingin memindahkan direktori "run" itu sendiri (termasuk semua yang ada di dalamnya) ke lokasi "root" tempat saya membuka ritsleting (yaitu di mana "x" berada, tetapi tidak di dalam "x").
Asumsi: Ada ada folder bernama "run", tapi saya tidak tahu berapa banyak direktori saya harus "cd" untuk sampai ke sana (bisa 3 (x, y, z), bisa 10 atau lebih Nama-nama. juga tidak dikenal dan tidak harus x, y, z dll).
Bagaimana saya bisa mencapai ini? Saya mencoba banyak variasi pertanyaan ini tetapi semuanya gagal.
Jawaban:
bagaimana dengan
dimana
(di samping catatan ada
--junk-paths
opsi di zip, baik saat zip atau unzipping)sumber
Saya akan melakukan ini
bash
, menggunakanglobstar
. Sebagaimana dijelaskan dalamman bash
:Jadi, untuk memindahkan direktori
run
ke direktori tingkat atasx
, dan kemudian menghapus sisanya, Anda dapat melakukan:The
shopt
perintah memungkinkanglobstar
pilihan. Themv x/**/run/ x/
akan memindahkan setiap subdirektori bernamarun
(catatan bahwa ini hanya bekerja jika hanya ada saturun
direktori) kex
danfind
akan menghapus direktori kosong.Anda bisa melakukan semuanya dalam shell dengan globbing yang panjang, jika Anda mau, tapi saya lebih suka jaring pengaman
find -empty
untuk memastikan tidak ada direktori kosong yang dihapus. Jika Anda tidak peduli tentang itu, Anda dapat menggunakan:sumber
Jelas lebih bertele-tele, tetapi melakukan pekerjaan dalam satu langkah:
Dengan asumsi Anda memiliki python diinstal
Cara Penggunaan
get_folder.py
Jalankan dengan direktori root (containg barang unzipped Anda) dan nama folder untuk "angkat" sebagai argumen:
Dan itu dilakukan:
sumber
Solusi Perl
Cara kerjanya sederhana:
find()
subrutin akan melintasi pohon direktori yang diberikan secara rekursif, menemukan direktori yang namanyarun
dan mendorongnya ke array nama file yang diinginkan. Dalam hal ini, kita mengasumsikan hanya ada satu file dalam daftar, sehingga setelah perintah selesai, kita menggunakandirmove()
dariFile::Copy::Recursive
modul, dan memindahkannya ke direktori kerja saat ini dari mana skrip dipanggil. Jadi dalam kasus Anda, Anda akan memanggilnya dari direktori induk kex
.Pohon direktori asli:
Hasil:
sumber