उपसर्ग / प्रत्यय के साथ नाम कैसे बदलें?


95

mv original.filename new.original.filenameमूल फ़ाइल नाम को पुन: लिखे बिना मैं कैसे करूँ ?

मुझे लगता है कि ऐसा कुछ करने में सक्षम हो सकता है mv -p=new. original.filenameया शायद mv original.filename new.~या जो भी हो - लेकिन मैं ऐसा कुछ नहीं देख सकता man mv/ info mvपृष्ठों को देखने के बाद ।

बेशक, मैं ऐसा करने के लिए एक शेल स्क्रिप्ट लिख सकता था, लेकिन क्या इसके लिए कोई मौजूदा कमांड / ध्वज नहीं है?

जवाबों:


122

बैश और zsh में आप ब्रेस एक्सपेंशन के साथ ऐसा कर सकते हैं । यह बस ब्रेसिज़ में मदों की एक सूची का विस्तार करता है। उदाहरण के लिए:

# echo {vanilla,chocolate,strawberry}-ice-cream
vanilla-ice-cream chocolate-ice-cream strawberry-ice-cream

तो आप अपना नाम निम्नानुसार कर सकते हैं:

mv {,new.}original.filename

जैसा कि यह विस्तार करता है:

mv original.filename new.original.filename

धन्यवाद, यह सबसे अच्छा समाधान लगता है - ksh के साथ भी काम करता है।
पीटर बॉटन

29
यह क्या नहीं करता है वाइल्ड कार्ड के साथ काम करना। अर्थात्, "echo {, new।} का उपयोग करके फ़ाइल नाम a, b, c, युक्त निर्देशिका में," abc new। * सूची प्राप्त करता है (क्योंकि ब्रेस विस्तार के माध्यम से फ़ाइल नाम की पीढ़ी वाइल्ड कार्ड वर्णों का विस्तार करने से पहले होती है - कम से कम अनुमान से)।
जोनाथन लेफलर

महीनों से मैं केवल मूल शेल कार्यक्षमता का उपयोग करके इस तरह के समाधान की तलाश कर रहा हूं ... मैं कभी भी उस चीज के साथ नहीं आया होगा जो सरल है, बहुत बहुत धन्यवाद!
flonk

ब्रेस एक्सपेंशन के संदर्भ के लिए धन्यवाद :-) वास्तव में मैं क्या देख रहा था!
पिम हजेब्रोक

1
मुझे उदाहरण पसंद है। मैं अब अपने लंच के दौरान बेसकिन रॉबिंस के पास जाने के मूड में महसूस कर रहा हूं।
श्रीधर सरनोबत

156

आप rename(1)कमांड का उपयोग कर सकते हैं :

rename 's/(.*)$/new.$1/' original.filename

संपादित करें: यदि renameउपलब्ध नहीं है और आपको एक से अधिक फ़ाइल का नाम बदलना है, तो शेल स्क्रिप्टिंग वास्तव में इसके लिए छोटी और सरल हो सकती है। उदाहरण के लिए, वर्तमान निर्देशिका में सभी का नाम बदलने के *.jpgलिए prefix_*.jpg:

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

इस सप्ताह के अंत में स्थापित ग्रेफाइट, और उनके पास एक ऐसा कदम है जो अनिवार्य रूप से ("सभी * .example फ़ाइलों को गोपनीय फ़ोल्डर में कॉपी करें, उदाहरण प्रत्यय को हटाकर")। असली उनकी ओर से आलसी, लेकिन rename 's/(.*).example/$1/' *.exampleमुझे टेडियम से बचा लिया।
कॉनरैड.डीन

2
यह अब तक का सबसे अच्छा जवाब है।
जीवनकाल

मुझे नहीं लगता कि आपको $इस परिदृश्य में पहली आवश्यकता है। तो बस's/(.*)/new.$1/'
बुद्धिमानी

1
renameकमांड मेरे RHEL 6 मशीन पर काम नहीं करता है। क्या इस कमांड के कोई अलग संस्करण हैं? for ... doneमेरे लिए काम किया।
रोब्सच

25

आप लूप के लिए बनाकर एक यूनिक्स संगत कई फ़ाइल नाम (वाइल्डकार्ड का उपयोग करके) प्राप्त कर सकते हैं:

for file in *; do
  mv $file new.${file%%}
done


4
यह बहुत अच्छा काम करता है। क्या ${file%%}करते हो? केवल $ {फ़ाइल} के समान
प्रतीत होता है

मैं $ {file %%} के बारे में उत्सुक हूँ
लुकास Bustamante

10

मैंने देखा है कि लोग एक renameकमांड का उल्लेख करते हैं , लेकिन यह यूनीक्स सिस्टम पर नियमित रूप से उपलब्ध नहीं है (जैसा कि लिनक्स सिस्टम के विपरीत है, या साइगविन - दोनों पर, नाम बदलना एक स्क्रिप्ट के बजाय एक निष्पादन योग्य है)। उस संस्करण की renameकाफी सीमित कार्यक्षमता है:

rename from to file ...

यह बदल देता से साथ फ़ाइल नाम के हिस्से के लिए , और उदाहरण के आदमी पेज में दिए गए है:

rename foo foo0 foo? foo??

यह foo1 से foo01, और foo10 से foo010, आदि का नाम बदल देता है।

मैं एक पर्ल स्क्रिप्ट का उपयोग renameकरता हूं, जिसे मैंने मूल रूप से पहले संस्करण कैमल बुक, लगभग 1992 से खोदा था, और फिर फ़ाइलों का नाम बदलने के लिए बढ़ाया गया था।

#!/bin/perl -w
#
# @(#)$Id: rename.pl,v 1.7 2008/02/16 07:53:08 jleffler Exp $
#
# Rename files using a Perl substitute or transliterate command

use strict;
use Getopt::Std;

my(%opts);
my($usage) = "Usage: $0 [-fnxV] perlexpr [filenames]\n";
my($force) = 0;
my($noexc) = 0;
my($trace) = 0;

die $usage unless getopts('fnxV', \%opts);

if ($opts{V})
{
    printf "%s\n", q'RENAME Version $Revision: 1.7 $ ($Date: 2008/02/16 07:53:08 $)';
    exit 0;
}
$force = 1 if ($opts{f});
$noexc = 1 if ($opts{n});
$trace = 1 if ($opts{x});

my($op) = shift;
die $usage unless defined $op;

if (!@ARGV) {
    @ARGV = <STDIN>;
    chop(@ARGV);
}

for (@ARGV)
{
    if (-e $_ || -l $_)
    {
        my($was) = $_;
        eval $op;
        die $@ if $@;
        next if ($was eq $_);
        if ($force == 0 && -f $_)
        {
            print STDERR "rename failed: $was - $_ exists\n";
        }
        else
        {
            print "+ $was --> $_\n" if $trace;
            print STDERR "rename failed: $was - $!\n"
                unless ($noexc || rename($was, $_));
        }
    }
    else
    {
        print STDERR "$_ - $!\n";
    }
}

यह आपको फ़ाइल नामों को मैप करने के लिए किसी भी पर्ल विकल्प या ट्रांसपेरेंट कमांड को लिखने की अनुमति देता है। अनुरोधित विशिष्ट उदाहरण में, आप उपयोग करेंगे:

rename 's/^/new./' original.filename

धन्यवाद, अगर मैं एक दूसरा उत्तर स्वीकार कर सकता हूं तो यह होगा। मैं एक मानक कमांड चाहता था जो कुछ ऐसा हो जो सिर्फ मेरे द्वारा उपयोग की जाने वाली किसी भी चीज पर काम करेगा, लेकिन मैं इस स्क्रिप्ट को उन मशीनों पर रख सकता हूं जो मैं अक्सर उपयोग करता हूं और यह अभी भी उपयोगी होगा।
पीटर बॉटन

जेम्स वोंग ने लिखा है कि आर्क लिनक्स के लिए, आप इस स्क्रिप्ट pacmanका उपयोग करके डाउनलोड और इंस्टॉल कर सकते हैं pacman -Sy perl-rename:। फिर इसे अपने बशके में एक उपनाम जोड़ें:alias rename='perl-rename'
जोनाथन लेफ़लर

क्या होगा अगर "से" या "से" खाली तार हैं, यानी आप प्रत्येक फ़ाइलनाम के लिए कुछ जोड़ना चाहते हैं या पूरी तरह से कुछ हटाना चाहते हैं
ट्रॉयसेफ

1
@ ट्रॉयसेफ़ - '.htmlफ़ाइल नामों में संलग्न करने के लिए, का उपयोग करें 's/$/.html/'- tmpफ़ाइल नामों में हर जगह से हटाने के लिए , उपयोग करें 's/tmp//g'( tmpहर जगह कुछ नहीं के साथ खोजें और बदलें)।
जोनाथन लेफलर


2

यदि यह एक संशोधन के लिए खुला है, तो आप उपसर्ग के बजाय एक प्रत्यय का उपयोग कर सकते हैं। तब आप मूल फ़ाइल नाम प्राप्त करने और प्रत्यय जोड़ने के लिए टैब-समापन का उपयोग कर सकते थे।

अन्यथा, यह कोई ऐसी चीज नहीं है जो mv कमांड द्वारा समर्थित है। एक साधारण शेल स्क्रिप्ट हालांकि सामना कर सकती थी।


अक्सर मैं दोनों चाहता हूं, लेकिन मुख्य रूप से उपसर्ग - जैसा कि आप कहते हैं, टैब पूरा करना प्रत्यय को संभाल सकता है।
पीटर बॉटन

1

मेरे मामले में मेरे पास फ़ाइलों का एक समूह है, जिनका नाम बदलने से पहले मुझे उनके साथ काम करने की आवश्यकता है। समूह में प्रत्येक फ़ाइल की अपनी भूमिका है और इसका अपना पैटर्न है।

परिणामस्वरूप मेरे पास इस तरह के नाम बदलने की आज्ञा है:

f=`ls *canctn[0-9]*`   ;  mv $f  CNLC.$f
f=`ls *acustb[0-9]*`   ;  mv $f  CATB.$f
f=`ls *accusgtb[0-9]*` ;  mv $f  CATB.$f
f=`ls *acus[0-9]*`     ;  mv $f  CAUS.$f

इसे भी आजमाएं:

f=MyFileName; mv $f {pref1,pref2}$f{suf1,suf2}

यह उपसर्गों और प्रत्ययों के साथ सभी संयोजनों का उत्पादन करेगा:

pref1.MyFileName.suf1
...
pref2.MyFileName.suf2

इसी समस्या को हल करने का एक और तरीका है कि मैपिंग ऐरे को बनाएं और नीचे दिखाए गए अनुसार प्रत्येक फ़ाइल प्रकार के लिए पूर्वसर्ग उपसर्ग जोड़ें।

#!/bin/bash
unset masks
typeset -A masks
masks[ip[0-9]]=ip
masks[iaf_usg[0-9]]=ip_usg
masks[ipusg[0-9]]=ip_usg
...
for fileMask in ${!masks[*]}; 
do  
registryEntry="${masks[$fileMask]}";
fileName=*${fileMask}*
[ -e ${fileName} ] &&  mv ${fileName} ${registryEntry}.${fileName}  
done

1

बल्क नाम फ़ाइलें बैश स्क्रिप्ट

#!/bin/bash
# USAGE: cd FILESDIRECTORY; RENAMERFILEPATH/MultipleFileRenamer.sh FILENAMEPREFIX INITNUMBER
# USAGE EXAMPLE: cd PHOTOS; /home/Desktop/MultipleFileRenamer.sh 2016_
# VERSION: 2016.03.05.
# COPYRIGHT: Harkály Gergő | mangoRDI (https://wwww.mangordi.com/) 

# check isset INITNUMBER argument, if not, set 1 | INITNUMBER is the first number after renaming
if [ -z "$2" ]
    then i=1;
else
    i=$2;
fi

# counts the files to set leading zeros before number | max 1000 files
count=$(ls -l * | wc -l)
if [ $count -lt 10 ]
    then zeros=1;
else
    if [ $count -lt 100 ]
        then zeros=2;
    else
        zeros=3
    fi
fi

# rename script
for file in *
do
    mv $file $1_$(printf %0"$zeros"d.%s ${i%.*} ${file##*.})
    let i="$i+1"
done

0

मुझे पता है कि यहां बहुत अच्छे उत्तर हैं, लेकिन मुझे प्रत्यय जोड़ते समय फ़ाइल नाम एक्सटेंशन को संभालने के लिए कोई संदर्भ नहीं मिला।

मुझे wavफ़ाइल एक्सटेंशन से पहले एक फ़ोल्डर में सभी फ़ाइलों में '_en' प्रत्यय जोड़ने की आवश्यकता थी ।

जादू यहाँ है: %.*

for filename in *.wav; do mv $filename ${filename%.*}_en.wav; done;

यदि आपको विभिन्न फ़ाइल एक्सटेंशनों को संभालने की आवश्यकता है, तो इस उत्तर को जांचें । थोड़ा कम सहज।

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