เปลี่ยนชื่อไฟล์ในไดเรกทอรี


10

วิธีการเปลี่ยนชื่อไฟล์ในไดเรกทอรีเช่นแฟ้มต่อไปนี้: ฉันจะต้องมีการเปลี่ยนชื่อเป็นPMC21375.pdf.txt 21375.txtเช่นฉันต้องการลบทั้งสองPMCและpdfจากแต่ละชื่อไฟล์

คำตอบ:


9

ด้วย 's rename:

rename 's/(PMC|\.pdf)//g' *pdf.txt 

การสาธิต :

$ ls *txt
PMC21375.pdf.txt
$ rename -n 's/(PMC|\.pdf)//g' *txt 
PMC21375.pdf.txt -> 21375.txt

จากshellพรอมต์ มันมีประโยชน์มากคุณสามารถใส่รหัสอย่างที่ฉันทำในการทดแทน

คุณสามารถลบ-n(สวิตช์โหมดแห้ง) เมื่อการทดสอบของคุณกลายเป็นหุบเขา

คำเตือน มีเครื่องมืออื่น ๆ ที่มีชื่อเดียวกันซึ่งอาจหรืออาจจะไม่สามารถทำได้ดังนั้นควรระมัดระวัง

หากคุณเรียกใช้คำสั่งต่อไปนี้ ( linux)

$ file $(readlink -f $(type -p rename))

และคุณมีผลลัพธ์เช่นเดียวกับ

.../rename: Perl script, ASCII text executable

นี่น่าจะเป็นเครื่องมือที่ถูกต้อง =)

หากไม่ต้องการให้เป็นค่าเริ่มต้น (โดยปกติจะเป็นตัวพิมพ์ใหญ่) Debianและอนุพันธ์เช่นUbuntu:

$ sudo update-alternatives --set rename /path/to/rename

(แทนที่/path/to/renameเส้นทางของperl's renameคำสั่งของคุณ


สุดท้ายนี้ต้องไม่ใช้เครื่องมือนี้เขียนโดย Larry Wall พ่อของ Perl


นี่จะไม่ลบออก.pdfจากชื่อไฟล์
William Everett

โพสต์แก้ไขตามนั้น
Gilles Quenot

5

นอกจากคำสั่งเปลี่ยนชื่อคุณสามารถทำได้โดยตรงในทุบตี (หนึ่งในหลาย ๆ วิธี):

 for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done

แก้ไขเพื่อแสดง Pinyaka มันทำงานอย่างไร:

hmontoliu@ulises2:/tmp/foo$ touch PCM21375.pdf.txt PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ ls
   PCM21375.pdf.txt  PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done
hmontoliu@ulises2:/tmp/foo$ ls
   21375.txt  21376.txt

สิ่งนี้จะไม่ลบ.pdfชื่อไฟล์ออก
William Everett

คุณเคยลองไหม เพราะสำหรับฉันมันทำ แสดงในการแก้ไข
hmontoliu

ความผิดฉันเอง. ฉันคิดว่ามันแค่แปลงตัวอักษรใหญ่ upvoted
William Everett

4

มีสาธารณูปโภคหลายสำหรับการเปลี่ยนชื่อไฟล์เป็น renameแต่หนึ่งในที่ง่ายในการใช้งาน ในกรณีของคุณคุณสามารถทำได้:

rename PMC '' *txt
rename .pdf '' *txt

พารามิเตอร์แรกคือส่วนของชื่อไฟล์ที่จะแทนที่ พารามิเตอร์ที่สองคือสตริงการแทนที่ ที่นี่ฉันใช้''เพื่อเป็นตัวแทนของสตริงว่าง พารามิเตอร์ทั้งหมดต่อไปนี้เป็นไฟล์ที่จะเปลี่ยนชื่อที่นี่ฉันใช้*txtเพื่อ จำกัด การแทนที่ไฟล์ข้อความ

renameควรมีอยู่แล้วหากคุณใช้งาน Linux หากคุณใช้งาน * BSD หรือ OS X คุณอาจต้องติดตั้งก่อน


ฉันทำไม่ได้สิ่งที่มี renameGNU มีหนึ่งรายการจากหนึ่งรายการutil-linuxและperlมีไวยากรณ์ที่แตกต่าง สิ่งที่คุณกำลังอ้างถึงดูเหมือนเป็นสิ่งutil-linuxที่เรียกว่าบางครั้งเรียกว่าrename.ulเพื่อไม่ให้สับสนกับrenameจากperlในขณะที่ในระบบอื่น ๆ บางอย่างrenameเป็นหนึ่งจาก util-linux และคนที่perlเรียกว่าprenameจาก
Stéphane Chazelas

1
Mine เป็นหนึ่งใน util-linux ฉันคิดผิดว่ามันเป็นส่วนหนึ่งของ coreutils ของ GNU
wingedsubmariner

ค่าเริ่มต้นของการเปลี่ยนชื่อรุ่น Debian จะเป็นเช่นนี้rename 's/PMC// *.txtและrename s/\.pdf// *.txt
William Everett

1

ก่อนทำการสำรองไฟล์ของคุณ! โดยทั่วไปแล้วคุณสามารถใช้ python หนึ่งซับในไดเรกทอรีปัจจุบันด้วยรูปแบบทั่วไป:

python -c "import glob,os; [os.rename(fn, fn.replace('PATTERN', 'REPLACE')) for fn in glob.glob('PATH/*')]"

ในกรณีเฉพาะของคุณคุณสามารถใช้สองครั้ง:

python -c "import glob,os; [os.rename(fn, fn.replace('.pdf', '')) for fn in glob.glob('*')]"

เพื่อลบ.pdfและอีกครั้ง:

python -c "import glob,os; [os.rename(fn, fn.replace('PMC', '')) for fn in glob.glob('*')]"

PMCเพื่อลบ


0

ลองสิ่งนี้:

for i in *.pdf.txt; do j=${i//\.pdf/}; j=${j//PMC/}; mv $i $j; done

j=${i//\.pdf/}หมายถึงการทดแทน.pdfใน$iมีอะไร เช่นเดียวกันกับการมอบหมาย j ครั้งที่สองเพื่อกำจัด PMC


0

หากคุณกำลังใช้zshงานนั่นเป็นงานปกติสำหรับzmv:

zmv 'PMC(*).pdf.txt' '$1.txt'

( zmvจัดการกับความขัดแย้งที่อาจเกิดขึ้นได้อย่างสวยงาม)

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