มีคำสั่ง linux เช่น mv แต่มี regex หรือไม่


40

ยกตัวอย่างเช่นผมต้องการที่จะmv (.*?).sql $1.php,

มีคำสั่งที่ให้ฉันระบุรูปแบบการเปลี่ยนชื่อหรือไม่?

คำตอบ:


32

อย่างที่คนอื่น ๆ พูดถึงคุณrenameทำได้ดี แต่อ่าน man page ( man rename) ก่อนที่จะลอง มีอย่างน้อยสองเครื่องมือที่แตกต่างกันอย่างสิ้นเชิงออกมีเรียกrenameและสิ่งที่คุณจะต้องขึ้นอยู่กับการกระจายของคุณ การโทรหาพวกเขาอย่างไม่ถูกต้องอาจเป็นอันตรายได้

นี่คือหน้าคู่มือสำหรับ Larry Wall ที่มาพร้อมกับ Ubuntu คุณให้มันแสดงออก perl เช่นrename 's/\.sql$/.php/' *.sql

นี่คือ man pageสำหรับการเปลี่ยนชื่อที่มาพร้อมกับ Red Hat และ CentOS รุ่นเก่า การใช้งานคือการทดแทนสตริงง่าย ๆ เช่นrename .sql .php *.sql

คุณสามารถใช้ bash one-liner เพื่อประมวลผลแต่ละไฟล์ทีละไฟล์:

$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done

ใครช่วยอัปโหลดไบนารี Windows สำหรับการเปลี่ยนชื่อแบบ perl ได้หรือไม่
mcandre

การเปลี่ยนชื่อรุ่น Perl ไม่สามารถย้ายไฟล์จากระบบไฟล์หนึ่งไปยังอีกระบบหนึ่งได้
lilydjwg

ทุบตีหนึ่งซับเป็นประโยชน์โดยเฉพาะอย่างยิ่งเมื่อไม่มีrenameฟังก์ชั่น (เช่น busybox)
artm

10

มีrename(1)ซึ่งไม่ได้ใช้ regexes แต่สามารถแก้ปัญหาของคุณ:

rename .sql .php *.sql

นอกจากนี้ยังมีmmv(1)แต่ฉันไม่คุ้นเคยกับวิธีการทำงาน


ใน Ubuntu และ Debian (ไม่แน่ใจเกี่ยวกับดิสทริบิวชันอื่น ๆ ) ให้/usr/bin/renameลิงค์ไป/usr/bin/prenameตามค่าเริ่มต้นซึ่งใช้ regexps
inkaphink

5

G'day,

คุณสามารถลองเข้าร่วม

for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

หรือเพื่อให้ใช้การเปลี่ยนแปลงของ regex เพียงเล็กน้อย

for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

เพื่อความสนุกในการเขียนโปรแกรมเชลล์ (-:


2
สิ่งนี้ล้มเหลวด้วยไฟล์ที่มีช่องว่างในชื่อดังนั้นควรระวัง หนึ่งควรไม่เคยแยกlsเอาท์พุท
slhck

THe sedตัวอย่างค่อนข้างดีแม้ว่า
bright-star

2

เป็นช่างประปาฉันชอบท่อ :)

หมายเหตุ: คำตอบนี้เป็น verbose - ในฐานะที่เป็นเด็กใหม่ฉันขอขอบคุณเมื่อมีคนที่รู้ว่าต้องใช้เวลาในการอธิบายดังนั้นฉันจึงจ่ายเงินไปข้างหน้า หากคุณไม่ได้เป็นน้องใหม่โปรดแก้ตัวความยาวและคำฟุ่มเฟื่อย

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash

ที่ไหน:

ls -1 *_201[67][0-9]*

แสดงรายการไฟล์ทั้งหมดที่ตรงกับรูปแบบในกรณีนี้ฉันกำลังมองหาไฟล์ที่มีวันที่ในชื่อไฟล์ในรูปแบบ 'YYYYMMDD'

sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
#        : | |    |     |                  | |       |                    |:                                 :
#        : |^2....^    ^3..................^^4.......^                    |:                                 :
#        :^1..............................................................^:                                 :
#        /................filename.................pattern................./...mkdir...and....mv...command.../

^ 1: กลุ่มการจับภาพที่ 1 - ชื่อไฟล์ทั้งหมด

^ 2: กลุ่มการจับภาพที่ 2 - ส่วนที่ 1 ของรูปแบบชื่อไฟล์

^ 3: กลุ่มการจับภาพที่ 3 - ส่วนชื่อไฟล์ที่ 2 - ที่นี่วันที่เป็น 'YYYYMMDD'

^ 4: กลุ่มการจับภาพที่ 4 - ชื่อไฟล์ส่วนเสริมระหว่างวันที่และส่วนขยายและส่วนขยายเอง

Sooooo .... ถ้าฉันมีไฟล์ชื่อ

CallLog_555123412_20161231-214403.7z

... แล้ว

mkdir -p \2\/\3; mv \1 \2\/\3\/\1

จริง ๆ แล้วหมายถึง

# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z

โปรดทราบว่าเอาต์พุตของคำสั่ง sed ถูกไพพ์ไปที่ 'bash' เพื่อเรียกใช้งาน ในการดูไฟล์ที่เสนอเป็นครั้งแรกโดยไม่ต้องย้ายไฟล์จริงๆให้ลบ '| ทุบตี 'ในตอนท้ายและลองดังนี้:

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'

สิ่งนี้จะไม่ทำการเปลี่ยนแปลงใด ๆ เลย แต่คุณจะเห็นคำสั่งที่จะถูกดำเนินการหากคุณเรียกใช้ด้วย '| ทุบตี 'ติดแท็กในตอนท้าย

สิ่งนี้มีประโยชน์เพราะคุณสามารถสร้างไดเรกทอรีย่อยใด ๆ ที่คุณต้องการจากส่วนต่าง ๆ ในชื่อไฟล์หรือสิ่งอื่นใดที่คุณเพิ่มลงในข้อความ 'การแทนที่' ในคำสั่ง sed โปรดทราบว่า sed ต้องใช้อักขระเลี่ยงจำนวนมาก

วงเล็บ SED Regex:

(... ) ต้องมีการยกเว้นสำหรับการจับภาพการจัดกลุ่ม -> \ (... \)

{m, n} ต้องการการหลบหนีสำหรับการหาปริมาณวัตถุก่อนหน้า -> \ {m, n \}

/ ต้องหลบหนีในสตริงการแทนที่ -> \ /

[... ] ไม่ต้องหลบหนีสำหรับคลาสตัวละคร

\ 1 ในสตริงการแทนที่หมายถึงกลุ่มที่ถูกจับครั้งที่ 1 และอื่น ๆ ...

คำเตือนการรักษาความปลอดภัย: ไม่เคยท่อใด ๆ ที่ 'ทุบตี' เว้นแต่คุณจะเข้าใจอย่างถ่องแท้ ...

หวังว่าจะช่วยล้างการอุดตัน :)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.