ยกตัวอย่างเช่นผมต้องการที่จะmv (.*?).sql $1.php
,
มีคำสั่งที่ให้ฉันระบุรูปแบบการเปลี่ยนชื่อหรือไม่?
ยกตัวอย่างเช่นผมต้องการที่จะmv (.*?).sql $1.php
,
มีคำสั่งที่ให้ฉันระบุรูปแบบการเปลี่ยนชื่อหรือไม่?
คำตอบ:
อย่างที่คนอื่น ๆ พูดถึงคุณ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
rename
ฟังก์ชั่น (เช่น busybox)
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
เพื่อความสนุกในการเขียนโปรแกรมเชลล์ (-:
ls
เอาท์พุท
sed
ตัวอย่างค่อนข้างดีแม้ว่า
เป็นช่างประปาฉันชอบท่อ :)
หมายเหตุ: คำตอบนี้เป็น 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 และอื่น ๆ ...
คำเตือนการรักษาความปลอดภัย: ไม่เคยท่อใด ๆ ที่ 'ทุบตี' เว้นแต่คุณจะเข้าใจอย่างถ่องแท้ ...
หวังว่าจะช่วยล้างการอุดตัน :)
ติดตั้งmmv
จากนั้นทำสิ่งนี้:
mmv "*.sql" "#1.php"