เปลี่ยนชื่อไฟล์และไดเรกทอรี (เพิ่มคำนำหน้า)


142

ฉันต้องการเพิ่มคำนำหน้าในโฟลเดอร์และไดเรกทอรีทั้งหมด

ตัวอย่าง:

ฉันมี

Hi.jpg
1.txt
folder/
this.file_is.here.png
another_folder.ok/

ฉันต้องการเพิ่มคำนำหน้า "PRE_"

PRE_Hi.jpg
PRE_1.txt
PRE_folder/
PRE_this.file_is.here.png
PRE_another_folder.ok/

ความนับถือ,


ใช้ AWK ตามคำตอบนี้ : awk '$ 0 = "prefix" $ 0' file> new_file
Mark

คำตอบ:


228

ขอบคุณPeter van der Heijdenนี่คือสิ่งที่ใช้ได้กับชื่อไฟล์ที่มีช่องว่างอยู่:

for f in * ; do mv -- "$f" "PRE_$f" ; done

("-" เป็นสิ่งจำเป็นเพื่อให้ประสบความสำเร็จกับไฟล์ที่ขึ้นต้นด้วยขีดกลางซึ่งชื่อจะถูกตีความว่าเป็นสวิตช์สำหรับคำสั่ง mv)


เฮ้จริงสิ่งนี้จะใช้ไม่ได้อย่างสมบูรณ์หากคุณมีไฟล์ที่มีช่องว่างอยู่
CanSpice

12
หากคุณเปลี่ยนlsคำสั่งเป็น*และใส่เครื่องหมายคำพูดคู่รอบอาร์กิวเมนต์mvจะใช้ได้กับไฟล์ที่มีช่องว่าง
Peter van der Heijden

@ CanSpice เป็นไปได้ไหมที่จะย้อนกลับการดำเนินการนี้ (ลบคำนำหน้า) ด้วยสคริปต์ที่คล้ายกัน
Pascal Qyy

3
ขอบคุณเพื่อน นักศึกษาฝึกงานที่นี่สูญเสียตัวครอบนิ้วของเขาโดยเปลี่ยนชื่อไฟล์ทั้งหมด 67 ไฟล์ ไชโย
Felipe

1
ควรเป็น "mv -" ไม่ใช่แค่ "mv" เพื่อป้องกันไฟล์ที่ขึ้นต้นด้วยเครื่องหมายขีดกลางมิฉะนั้นจะถูกตีความว่าเป็นสวิตช์คำสั่ง ฉันจะสนับสนุนการแก้ไขเพื่อแก้ไขสิ่งนี้
Jacob C. กล่าวว่า Reinstate Monica

83

ใช้เปลี่ยนชื่อสคริปต์ด้วยวิธีนี้:

$ rename 's/^/PRE_/' *

ไม่มีปัญหากับอักขระเมตาหรือช่องว่างในชื่อไฟล์


3
บางระบบมียูทิลิตี้ util-linux ที่เรียกว่า "เปลี่ยนชื่อ" ซึ่งทำงานแตกต่างกัน (บน Ubuntu เรียกว่า "rename.ul")
หยุดชั่วคราวจนกว่าจะมีประกาศอีกครั้ง

renameช่วยให้ฉันจัดการกับการเปลี่ยนชื่อไฟล์หลาย ๆ ไฟล์ได้อย่างง่ายดาย
Alan Haggai Alavi

61

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

ls | xargs -I {} mv {} PRE_{}

ls | xargs -I {} mv {} {}_SUF

มันกำลังใช้ตัวเลือกการแทนที่พารามิเตอร์ของ xargs: -I และคุณสามารถดูรายละเอียดเพิ่มเติมได้จากหน้าคน


2
PS: หากคุณต้องการเปลี่ยนชื่อไฟล์ส่วน (ไดเร็กทอรี) ของไดเร็กทอรีปัจจุบันให้กรองก่อน xargs เช่น:ls *.old | xargs -I {} mv {} PRE_{}
Zheng Qsin

การใช้การเปลี่ยนชื่อไม่ได้ผลอย่างน่าสนใจ การใช้ xargs ทำได้ดีสำหรับการตั้งค่า RHEL ของฉันดังนั้น +1 สำหรับตัวเลือกนี้ทำให้ง่ายต่อการเข้าใจคำสั่ง
Acewin

ใช้ไม่ได้หากชื่อไฟล์มีเครื่องหมายคำพูดเดียวล้มเหลวด้วย: xargs: อัญประกาศเดี่ยวที่ไม่ตรงกัน โดยค่าเริ่มต้นจะเป็นราคาพิเศษสำหรับ xargs เว้นแต่คุณจะใช้ตัวเลือก -0
Evgeny Veretennikov

38

ซึ่งสามารถทำได้โดยใช้findคำสั่งง่ายๆ:

find * -maxdepth 0 -exec mv {} PRE_{} \;

PRE_คำสั่งดังกล่าวจะนำหน้าไฟล์และโฟลเดอร์ทั้งหมดในไดเรกทอรีปัจจุบันด้วย


8

ในการเพิ่มคำนำหน้าให้กับไฟล์และโฟลเดอร์ทั้งหมดในไดเร็กทอรีปัจจุบันโดยใช้ util-linux rename(ตรงข้ามกับprenameตัวแปร perl จาก Debian และระบบอื่น ๆ ) คุณสามารถทำได้:

rename '' <prefix> *

สิ่งนี้จะค้นหาการเกิดขึ้นครั้งแรกของสตริงว่าง (ซึ่งพบได้ทันที) จากนั้นแทนที่เหตุการณ์นั้นด้วยคำนำหน้าของคุณจากนั้นติดกาวที่ส่วนที่เหลือของชื่อไฟล์ไปที่ส่วนท้ายของสิ่งนั้น เสร็จแล้ว

สำหรับคำต่อท้ายคุณจะต้องใช้รุ่นของ perlหรือใช้ค้นหา


util-linuxใน Debian /usr/bin/rename.ulยืดดูเหมือนว่าจะให้สิ่งนี้เป็น
user1338062



2

นี่คือสคริปต์ง่ายๆที่คุณสามารถใช้ได้ ฉันชอบใช้โมดูลที่ไม่ได้มาตรฐานFile::chdirเพื่อจัดการการcdดำเนินการจัดการดังนั้นหากต้องการใช้สคริปต์นี้ตามที่เป็นอยู่คุณจะต้องติดตั้ง ( sudo cpan File::chdir)

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;
use File::chdir; # allows cd-ing by use of $CWD, much easier but needs CPAN module

die "Usage: $0 dir prefix" unless (@ARGV >= 2);
my ($dir, $pre) = @ARGV;

opendir(my $dir_handle, $dir) or die "Cannot open directory $dir";
my @files = readdir($dir_handle);
close($dir_handle);

$CWD = $dir; # cd to the directory, needs File::chdir

foreach my $file (@files) {
  next if ($file =~ /^\.+$/); # avoid folders . and ..
  next if ($0 =~ /$file/); # avoid moving this script if it is in the directory

  move($file, $pre . $file) or warn "Cannot rename file $file: $!";
}

1

ในระบบของฉันฉันไม่มีrenameคำสั่ง นี่คือซับง่ายๆ พบไฟล์ HTML ทั้งหมดแบบวนซ้ำและเพิ่มprefix_หน้าชื่อ:

for f in $(find . -name '*.html'); do mv "$f" "$(dirname "$f")/prefix_$(basename "$f")"; done

1
กับfindคุณยังสามารถรันคำสั่งไม่ต้องห่วง: stackoverflow.com/a/33297439/2351568
DJCrashdummy

0

สิ่งนี้จะนำหน้าไฟล์ของคุณในไดเรกทอรี

${f%/*}เป็นเส้นทางจนถึงเฉือนที่ผ่านมา/-> ไดเรกทอรี

${f##*/}คือข้อความได้โดยไม่ต้องอะไรก่อนเฉือนสุดท้าย/-> ชื่อไฟล์โดยไม่ต้องเส้นทาง

นั่นคือสิ่งที่เป็นไป:

for f in $(find /directory/ -type f); do 
  mv -v $f ${f%/*}/$(date +%Y%m%d)_Prefix_${f##*/}
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.