ต่อท้ายข้อความในชื่อไฟล์ที่ไม่มีจุด


9

รับไฟล์ต่อไปนี้:

english_api
english_overview
style.css

ฉันอยากจะได้:

english_api.html
english_overview.html
style.css

กล่าวอีกนัยหนึ่งวิธีผนวกข้อความไปยังไฟล์ทั้งหมดที่ไม่มีจุด ( .) ภายในไดเรกทอรีโดยใช้เทอร์มินัล

เห็นได้ชัดว่ามีไฟล์จำนวนมากในโฟลเดอร์นั้น ฉันเพิ่งเขียน 3 เป็นตัวอย่าง

ถ้าฉันจะบอกว่าแทนที่.cssด้วย.htmlในโฟลเดอร์นั้นฉันจะใช้:

rename .css .html *.css

แต่ฉันไม่สามารถคิดถึงวิธีจับคู่ไฟล์ที่ไม่มีบางสิ่งได้ นอกจากนี้วิธีการผนวก (vs replace) โดยใช้renameคำสั่ง?

คำตอบ:


13

ลองfindคำสั่งนี้

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

มันเปลี่ยนชื่อไฟล์ที่ไม่มีจุดในชื่อไฟล์ของพวกเขาอยู่ในไดเรกทอรีปัจจุบันในfilename.htmlรูปแบบนี้( เพิ่ม.htmlในที่สุด )

. -> แสดงถึงไดเรกทอรีปัจจุบัน

-type f -> เพื่อทำการดำเนินการนี้กับไฟล์เท่านั้น

! -name "*.*" -> พิมพ์ชื่อไฟล์ที่ไม่มีจุดในชื่อ

-exec mv {} {}.html -> findคำสั่งดำเนินการย้าย (หรือ) การดำเนินการเปลี่ยนชื่อในชื่อไฟล์ที่แยก

\; -> แสดงถึงจุดสิ้นสุดของfindคำสั่ง


6

ในทุบตีคุณสามารถใช้globs เปลือกเพิ่มเติมเช่น

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

(ลบechoเมื่อคุณยืนยันแล้วว่ามันตรงกับรูปแบบที่ถูกต้อง) ถ้า globbing shopt -s extglobขยายไม่ได้เปิดใช้แล้วคุณสามารถเปิดใช้งานได้ด้วย

อีกตัวเลือกหนึ่งคือการใช้renameฟังก์ชันperl-based กับ regex ที่ไม่รวมตัวอักษร.

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

(ลบnตัวเลือกเมื่อคุณยืนยันแล้วว่ามันตรงกับรูปแบบที่ถูกต้อง)


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; doneคำสั่งเปลี่ยนชื่อไดเรกทอรีด้วย
Avinash Raj

2

mmvของฉันที่ต้องการในกรณีเช่นนี้คือ ไม่ได้ติดตั้งเป็นค่าเริ่มต้นใน Ubuntu แต่คุณสามารถติดตั้งได้โดยใช้sudo apt-get install mmvคำสั่ง

ในกรณีของคุณคุณต้องใช้สองครั้ง:

  1. เปลี่ยนชื่อไฟล์ทั้งหมดจากไดเรกทอรีปัจจุบันโดยเพิ่ม.htmlที่ส่วนท้ายของชื่อไฟล์แต่ละชื่อ:

    mmv -v '*' '#1.html'
    
  2. เปลี่ยนชื่ออีกครั้ง (ย้อนกลับ) ไฟล์ทั้งหมดที่มีอยู่ก่อนหน้านี้ในชื่ออย่างน้อยหนึ่ง.จุด (จุด):

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

หรือในหนึ่งบรรทัด:

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

-vตัวเลือกไม่ได้บังคับ ฉันใช้มันสำหรับเอาต์พุตแบบ verbose เท่านั้นโดยที่ไม่มีmmvการดำเนินการอย่างเงียบ ๆ

ดูman mmvข้อมูลเพิ่มเติม


1

ด้วยคำสั่ง Perl เปลี่ยนชื่อ ( prename) คุณสามารถเพิ่มเงื่อนไขที่ชื่อไฟล์จะต้องมีจุด หากตัวอย่างโค้ด Perl ไม่เปลี่ยนชื่อไฟล์ไฟล์นั้นจะไม่มีการเปลี่ยนแปลง ต่อไปนี้เป็นวิธีการเขียน:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

คำตอบนั้นสมบูรณ์แบบฉันยังให้คำสั่งอีกอย่างที่ทำงานนี้:

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

คำอธิบายบางอย่าง:

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.

บันทึก :

ฉันลองสถานการณ์ของคุณและคำสั่งทำให้งาน


6
สิ่งนี้ล้มเหลวในชื่อไฟล์ที่มีช่องว่างทุกประเภท (ช่องว่างแท็บบรรทัดใหม่ ฯลฯ ) ในฐานะที่เป็นกฎทั่วไปที่คุณไม่ควรแยก ls
terdon

Thats terdon ขวาขอขอบคุณสำหรับความคิดเห็นของคุณ แต่ฉันจะแก้ปัญหานี้ในคำสั่งเดียวกัน
Nux

3
คุณทำไม่ได้จริงๆ มีวิธีที่เกือบจะไม่มีความปลอดภัยในการสั่ง ls แจง ถ้าคุณอยากจะทำมันใช้awkและลองสิ่งที่ต้องการsh printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | shที่จะยังคงแบ่งชื่อไฟล์ด้วยขึ้นบรรทัดใหม่ แต่อย่างน้อยก็สามารถจัดการกับช่องว่าง เป็นสิ่งจำเป็นสำหรับกรณีที่คุณมีชื่อไฟล์ที่เริ่มต้นด้วย-- -
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.