फ़ाइलों और निर्देशिकाओं का नाम बदलें (उपसर्ग जोड़ें)


137

मैं सभी फ़ोल्डर्स और निर्देशिकाओं में उपसर्ग जोड़ना चाहूंगा।

उदाहरण:

मेरे पास है

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 = "उपसर्ग" $ 0' फ़ाइल> new_file
मार्क

जवाबों:


224

पीटर वैन डेर हाइजेन के लिए धन्यवाद , यहाँ एक है कि उनमें रिक्त स्थान के साथ फ़ाइल नाम के लिए काम करेंगे:

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

("-" डैश के साथ शुरू होने वाली फ़ाइलों के साथ सफल होने के लिए आवश्यक है, जिनके नाम अन्यथा एमवी कमांड के स्विच के रूप में व्याख्या किए जाएंगे)


हेह, सच है, यह पूरी तरह से काम नहीं करेगा यदि आपके पास इसमें एक स्थान के साथ एक फ़ाइल है।
२१:३

12
यदि आप lsकमांड को बदलने *और तर्कों के चारों ओर दोहरे उद्धरण-चिह्न लगाने के लिए mv, यह रिक्त स्थान वाली फ़ाइलों के लिए काम करेगा।
पीटर वैन डेर हाइजेन

@CanSpice क्या एक समान स्क्रिप्ट के साथ इस ऑपरेशन को रिवर्स करना (उपसर्ग को हटाना) संभव है?
पास्कल क्यी

3
धन्यवाद दोस्त। यहां इंटर्न सभी 67 फाइलों का नाम बदलकर अपनी फिंगर कैप खो रहे थे। चीयर्स।
फेलिप

1
यह "mv -" केवल "mv" नहीं होना चाहिए, डैश के साथ शुरू होने वाली फ़ाइलों के खिलाफ गार्ड करने के लिए, जो अन्यथा कमांड स्विच पर व्याख्या की जाएगी। इसे सुधारने के लिए मैं एक संपादन का योगदान दूंगा।
जैकब सी। का कहना है कि मोनिका

81

का प्रयोग करें नाम बदलने स्क्रिप्ट इस तरह:

$ rename 's/^/PRE_/' *

फ़ाइलनाम में मेटाचैकर या व्हाट्सएप के साथ कोई समस्या नहीं है।


3
कुछ प्रणालियों में "नाम बदलने" नामक एक उपयोगिता-लिनेक्स उपयोगिता होती है जो अलग तरीके से काम करती है (उबंटू पर इसे "नाम बदलें" कहा जाता है)।
अगली सूचना तक रोक दिया गया।

renameहमेशा मुझे बहुत आसानी से कई फ़ाइल नाम को संभालने में मदद की है।
एलन हाग्गै अलवी

61

के लिए उपसर्ग या प्रत्यय जोड़ने फ़ाइलें (निर्देशिका) के लिए, आप के द्वारा सरल और शक्तिशाली तरीका इस्तेमाल कर सकते हैं xargs :

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

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

यह xargs के पैरामैटर-रिप्लेसिंग विकल्प का उपयोग कर रहा है: -I। और आप मैन पेज से अधिक विवरण प्राप्त कर सकते हैं।


2
पुनश्च: यदि आप केवल वर्तमान निर्देशिका के भाग फ़ाइलों (निर्देशिकाओं) का नाम बदलना चाहते हैं , तो इसे xargs से पहले फ़िल्टर करें, जैसे:ls *.old | xargs -I {} mv {} PRE_{}
झेंग Qsin

दिलचस्प रूप से नाम बदलने से काम नहीं चला। इस विकल्प के लिए मेरे आरएचईएल सेटअप +1 के लिए xargs का उपयोग करना ठीक रहा, इससे कमांड को समझना आसान हो गया
Acewin

काम नहीं करता है अगर फ़ाइल नाम में एकल उद्धरण है, इसके साथ विफल होता है: xargs: बेजोड़ एकल उद्धरण; जब तक आप -0 विकल्प का उपयोग नहीं करते हैं, तब तक डिफ़ॉल्ट उद्धरण xargs के लिए विशेष होते हैं
एवगेनी वेरिटेनिकोव

36

यह एक साधारण findआदेश चलाने के लिए किया जा सकता है :

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

उपरोक्त कमांड मौजूदा निर्देशिका में सभी फाइलों और फ़ोल्डरों को उपसर्ग करेगी PRE_


8

वर्तमान-निर्देशिका में उपयोग-लिनेक्स rename(जैसा कि विरोध किया गया है prename, डेबियन और कुछ अन्य प्रणालियों से पर्ल संस्करण) का उपयोग करके सभी फ़ाइलों और फ़ोल्डरों में एक उपसर्ग जोड़ने के लिए , आप यह कर सकते हैं:

rename '' <prefix> *

यह रिक्त स्ट्रिंग की पहली घटना को पाता है (जो तुरंत मिल जाता है) और फिर उस घटना को आपके उपसर्ग के साथ बदल देता है, फिर शेष फ़ाइल नाम पर उस के अंत तक glues करता है। किया हुआ।

के लिए प्रत्यय , आप की जरूरत है पर्ल संस्करण का उपयोग या उपयोग खोज


util-linuxडेबियन खिंचाव के रूप में यह प्रदान करने के लिए लगता है /usr/bin/rename.ul
user1338062

7

यदि आपके पास रूबी (1.9+) है

ruby -e 'Dir["*"].each{|x| File.rename(x,"PRE_"+x) }'


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.