Bagaimana cara memindahkan file ke folder terkait yang memiliki nama yang sama?

2

Skenario contoh:

Saya memiliki banyak file yang diakhiri .torrentdan saya ingin memindahkannya ke folder yang memiliki nama yang sama.

Misalnya diberikan file-file berikut:

abc.torrent
def.torrent
some files has spaces.torrent
or [special] (characters).torrent
or . (dots).torrent
xyz.torrent

Saya ingin memindahkannya ke folder yang sesuai (jika ada) yang memiliki nama yang persis sama, misalnya:

  • abc.torrent pergi ke abc/
  • def.torrent pergi ke def/
  • dan seterusnya

Jika folder tidak ada, file harus tetap tidak tersentuh (karena ini mungkin berhubungan dengan unduhan yang tidak lengkap).

Saya percaya BitTorrent tidak memiliki opsi seperti itu. Jika demikian, saya ingin mencari beberapa baris perintah untuk mencapainya.

Secara opsional, saya ingin menentukan folder sumber file saya, dan folder tujuan dengan direktori yang diharapkan.

Ada ide?

kenorb
sumber
@terdon Jika direktori tidak ada, abaikan file dan lanjutkan, karena file dapat dikaitkan dengan unduhan yang tidak lengkap.
kenorb
Oh well, saya memberikan kedua opsi.
terdon

Jawaban:

3
  • Non-rekursif:

    for t in *torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done 
    

    The ${var%pattern}sintaks menghilangkan pertandingan terpendek patterndari ujung variabel. Dalam hal ini, itu hanya menghapus ekstensi.

  • Secara rekursif (menggunakan bash):

    shopt -s globstar
    for t in **/*torrent; do [ -d "${t%.*}" ] && mv "$t" "${t%.*}"; done
    

    The globstarpilihan membuat **ditemukan file dan 0 atau lebih direktori. Perhatikan bahwa di atas mengharapkan direktori target menjadi subdirektori dari direktori induk file torrent. Jadi, jika suatu file berada di foo/bar/baz.torrent, itu akan dipindahkan ke foo/bar/baz/baz.torrent.

  • Non-rekursif, membuat direktori jika tidak ada:

    for t in *torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done 
    

    The -ppilihan mengatakan mkdiruntuk mencetak ada kesalahan jika direktori sudah ada dan untuk membuat direktori induk yang diperlukan. Jadi, mkdir -p foo/bar/bazjuga akan membuat foodan bardirektori jika tidak ada.

  • Secara rekursif, membuat direktori jika tidak ada:

    shopt -s globstar
    for t in **/*torrent; do mkdir -p "${t%.*}"; mv "$t" "${t%.*}"; done
    
terdon
sumber
Untuk bagian 'membuat direktori jika tidak ada', saya pikir Anda dapat menggunakan $_dalam mvperintah yang mkdirsepertinya memperbaruinya terlepas dari apakah direktori tersebut ada atau tidak.
hjk
**/*torrentversi menghasilkan jalur, jadi -dperiksa lagi jalurnya (bukan nama sendiri), di sini adalah versi yang menggunakan nama dasar dan pindah ke /foofolder:for t in **/*torrent; do [ -d /foo/"$(basename "${t%.*}")" ] && mv -v "$t" /foo/"$(basename "${t%.*}")/"; done
kenorb
3

Karena saya tidak dapat menemukan opsi semacam itu pada BitTorrent versi OS X, saya telah menulis satu baris berikut:

find . -name "*.torrent" -exec sh -c 'DST=$(find . -type d -name "$(basename "{}" .torrent)" -print -quit); [ -d "$DST" ] && mv -v "{}" "$DST/"' ';'

Ini akan mencari .torrentfile di direktori saat ini ( .) dan menemukan folder ( DST) dengan nama yang sama secara rekursif ditemukan di folder yang sama ( .). Untuk memeriksa direktori yang berbeda, ubah titik ( .) ke tujuan yang sesuai. Lihat naskah lengkap: mv_torrents.sh.

kenorb
sumber