Tambahkan teks ke nama file yang tidak mengandung titik

9

Diberikan file-file berikut:

english_api
english_overview
style.css

Saya ingin mendapatkan:

english_api.html
english_overview.html
style.css

Dengan kata lain cara menambahkan teks ke semua file yang Tidak Mengandung titik ( .) dalam direktori menggunakan terminal.

Jelas ada banyak file di folder itu; Saya hanya menulis 3 sebagai contoh.

Jika saya, katakanlah, ganti .cssdengan .htmldi folder itu, saya akan menggunakan:

rename .css .html *.css

Tapi saya tidak bisa memikirkan cara untuk mencocokkan file yang tidak mengandung sesuatu. Juga bagaimana menambahkan (vs mengganti) menggunakan renameperintah?

Bor691
sumber

Jawaban:

13

Coba findperintah ini ,

find . -type f ! -name "*.*" -exec mv {} {}.html \;

Itu mengubah nama file yang tidak mengandung titik-titik dalam nama file mereka yang ada di direktori saat ini ke filename.htmlformat ini ( ditambahkan .htmlpada yang terakhir ).

. -> Merupakan direktori saat ini

-type f -> Untuk melakukan operasi ini hanya pada file.

! -name "*.*" -> cetak nama file yang tidak memiliki titik di namanya.

-exec mv {} {}.html -> findperintah melakukan langkah ini (atau) mengubah nama operasi pada nama file yang diekstraksi.

\; -> Merupakan akhir dari findperintah.

Avinash Raj
sumber
6

Dalam bash, Anda bisa menggunakan contoh shell yang diperluas misalnya

for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done

(hapus echosetelah Anda mengonfirmasi itu cocok dengan pola yang benar). Jika globbing diperpanjang belum diaktifkan, Anda dapat mengaktifkannya dengan shopt -s extglob.

Pilihan lain adalah menggunakan renamefungsi berbasis perl dengan regex yang tidak termasuk literal.

rename -nv 's/^[^.]+$/$&.html/' path/to/files/*

(hapus nopsi setelah Anda mengonfirmasi itu cocok dengan pola yang benar).

Steeldriver
sumber
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; doneperintah mengubah nama direktori juga.
Avinash Raj
2

Saya lebih suka dalam kasus seperti ini mmv. Ini tidak diinstal secara default di Ubuntu, tetapi Anda dapat menginstal menggunakan sudo apt-get install mmvperintah.

Dalam kasus Anda, Anda perlu menggunakannya dua kali:

  1. Ganti nama semua file dari direktori saat ini dengan menambahkan .htmldi akhir setiap nama file:

    mmv -v '*' '#1.html'
    
  2. Ganti nama lagi (kembali) semua file yang sebelumnya atas namanya satu atau lebih .(titik):

    mmv -v '*.*.html' '#1.#2'
    

Atau, dalam satu baris:

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'

-vOpsi tidak wajib. Saya menggunakannya hanya untuk keluaran verbose karena tanpa itu mmvmelakukan tindakan diam-diam.

Lihat man mmvuntuk info lebih lanjut.

Radu Rădeanu
sumber
1

Dengan perintah Perl rename ( prename), Anda dapat menambahkan kondisi bahwa nama file harus mengandung titik. Jika cuplikan Perl tidak mengubah nama file, file itu tidak tersentuh. Berikut adalah beberapa cara untuk menulis ini:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
Gilles 'SANGAT berhenti menjadi jahat'
sumber
-2

Jawabannya sempurna, saya juga memberi Anda perintah lain yang melakukan pekerjaan ini:

ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh

Beberapa penjelasan:

ls - list directory contents

 -1     list one file per line

grep prints the matching lines.

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.

CATATAN :

Saya mencoba skenario Anda dan perintah membuat pekerjaan.

nux
sumber
6
Ini gagal pada nama file yang berisi semua jenis spasi putih (spasi, tab, baris baru, dll.). Sebagai aturan umum, Anda tidak boleh mengurails .
terdon
Terima kasih atas komentar Anda, tapi bagaimana saya bisa menyelesaikan ini dengan perintah yang sama
nux
3
Kamu tidak bisa benar-benar. Ada hampir tidak ada cara yang aman untuk mengurai ls. Jika Anda benar-benar ingin melakukannya menggunakan awkdan sh, coba sesuatu seperti printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Itu masih akan terputus pada nama file dengan baris baru tapi setidaknya itu bisa berurusan dengan spasi. The --diperlukan untuk kasus-kasus di mana Anda memiliki nama file yang dimulai dengan -.
terdon