कैसे कई फ़ाइलों का नाम बदलने के लिए (पैटर्न द्वारा नहीं, बल्कि प्रत्येक नए नाम के लिए संकेत दिया जाता है)?


2

मैं एक निर्देशिका में सभी फ़ाइलों का नाम बदलना चाहता हूं। नए नाम किसी भी पैटर्न का पालन नहीं करते हैं, इसलिए मैं उपयोग नहीं कर सकता rename। क्या ऐसा करने का कोई कुशल तरीका है, इसलिए मुझे mv foo.txt bar.txtहर एक फाइल के लिए उपयोग नहीं करना पड़ेगा ?


यदि नए नाम किसी भी पैटर्न का पालन नहीं करते हैं तो केवल एक चीज जो आप कर सकते हैं वह है निर्देशिका सामग्री को किसी फ़ाइल में सूचीबद्ध करना और फिर फ़ाइल को सूट करने के लिए संपादित करना।
'16:

आप प्रत्येक फ़ाइल के लिए एक नया नाम मांगने के लिए अपनी खुद की BASH स्क्रिप्ट लिख सकते हैं
वुल्फिस्तान

5
सरासर किस्मत से मैंने imv(renameutils से) खोज की जो आपको एक फ़ाइल को अंतःक्रियात्मक रूप से बदलने की अनुमति देता है। लेकिन यह केवल एक फ़ाइल को स्वीकार करेगा, इसलिए आपको एक लूप की आवश्यकता है for file in *; do imv "$file"; done:।
बॉबी

धन्यवाद बॉबी, यह वही है जिसकी मुझे तलाश है। क्या आप इसे एक उत्तर के रूप में पोस्ट कर सकते हैं, कृपया, ताकि मैं आपको ठीक से उत्थान कर सकूं?
n.st

1
Pinging @Bobby (n.st, आप @ -mention उपयोगकर्ताओं को स्पष्ट रूप से करने के लिए उन्हें एक सूचना प्राप्त करने के लिए में की जरूरत है।)
slhck

जवाबों:


3

जब एक स्क्रिप्ट के रूप में इसे लिखने के बारे में सोचता हूं तो मैंने जांच की कि क्या संभव नाम पहले से ही लिया गया है, और पता चलता है कि मेरा अनुमान "इंटरैक्टिव कदम" पहले से ही लिखा गया है और उपयोग करने के लिए तैयार है। अधिकांश प्रणालियों के लिए यह रेनेमिल्स-पैकेज में उपलब्ध होना चाहिए , जिसमें विभिन्न उपकरण होते हैं जो बहुत सहायक होते हैं:

  • qmv / qcp : क्विक मूव / कॉपी, सभी फाइलनाम को एक टेक्स्ट फाइल पर लिखता है जिसे तब संपादित किया जा सकता है।
  • imv / icp : इंटरएक्टिव मूव / कॉपी, फाइलों के नए नाम के लिए पूछता है।

इस मामले में imv/ के साथ समस्या icpयह है कि वे केवल एक तर्क को स्वीकार करते हैं:

imv FILENAME

एकाधिक तर्कों में त्रुटि आएगी। तो आपको मूल रूप से इसे एक छोटे forलूप में लपेटना होगा :

for file in *; do imv "$file"; done

यह निश्चित रूप से टाइप करने के लिए कठिन है, इसलिए हमें इसे फ़ंक्शन का उपयोग करने के लिए तैयार में लपेटना चाहिए जिसे हम अपनी .bashrcफ़ाइल में रख सकते हैं ।

# Mass Interactive Move
function mimv {
    for file in "$*"; do
        imv "$file"
    done
}

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


4

आप इस कमांड का उपयोग कर सकते हैं:

for i in *; do
   read -p "$i -> " newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

यह आपको प्रत्येक फ़ाइल के लिए एक नया नाम और for i in *वर्तमान निर्देशिका में हर निर्देशिका ( ) के लिए संकेत देगा । नया नाम पढ़ने को मिलता है $newname। यदि आप Enterएक नया नाम लिखे बिना हिट करते हैं , तो कुछ भी नहीं किया जाता है ( -z $newnameचेक, यदि $newnameखाली है ( z ero); !तार्किक है not), अन्यथा mvफ़ाइल का नाम बदलने के लिए उपयोग किया जाता है।


यदि आप फ़ाइल नाम को केवल थोड़ा बदलना चाहते हैं, तो यह अधिक कुशल है यदि आप इसे संपादित कर सकते हैं, पुराने फ़ाइल नाम से शुरू कर सकते हैं , जैसा कि @grawity द्वारा सुझाया गया है:

for i in *; do
   read -p "$i -> " -e -i "$i" newname
   if [[ ! -z "$newname" ]]; then
      mv -v -- "$i" "$newname"
   fi
done

मैंने इसे रिक्त स्थान और ब्रेसिज़ वाले फ़ाइलनाम के साथ परीक्षण किया, हालांकि कृपया इसे अपने जोखिम पर उपयोग करें (और पहले की मूल फ़ाइलों का बैकअप बनाएं)।


2
हे, तुम तेज थे। और आपने नामों में रिक्त स्थान के साथ परीक्षण किया, जिसे मैं भूल गया।
हनीस

2
यदि आप उपयोग करते हैं read -p "$i -> " -e -i "$i" newname, तो यह आपको पुराने नाम को सीधे संपादित करने देगा।
grawity

@Hennes: मैं एक टिप्पणी द्वारा प्रशिक्षित किया गया था slhck (द्वारा superuser.com/questions/593396/... ) ने उसी दिन;)
MPY

@ शुद्धता: धन्यवाद, यह एक साफ चाल है - मैंने इसे अपने उत्तर में शामिल कर लिया।
खसखस

@ शिवाय: आप को छोड़कर, -e -i "$i"प्रमुख हिस्सा नहीं है: डी
भूरापन

-1
#! / usr / bin / env बैश

$ में फ़ाइलों के लिए (गूंज *);
करना
     इको-एन नाम बदलें $ फाइलें किस नाम से जानी जाती हैं? ;
     नया_नाम पढ़ें;
     mv "$ फाइलें" "$ new_name";
किया हुआ

2
for files in $(echo *)बहुत ही बेमानी है - इसे प्रतिस्थापित किया जा सकता है for files in *, जो नामों में रिक्त स्थान के साथ भी ठीक से काम करता है।
grawity

ऐ। मैं एक पुराने संस्करण में इसका इस्तेमाल किया। एक जो फ़ाइलों के एक पैटर्न के लिए कहा ताकि आप बस का उपयोग कर सकते हैं। / परीक्षण testfile सभी फ़ाइलों का नाम बदलने के लिए testfile *। मैंने पोस्ट करने से पहले उन हिस्सों को काट दिया। (यह उतना अच्छा नहीं था जितना कि mpy का जवाब है, लेकिन मैं छोटी चीजों को जोड़ना पसंद करता हूं, जैसे कि [-$ $ 1]; फिर गूंज का उपयोग करें: $ 0 फाइलें एक्ज़िट फाई का नाम बदलने के लिए
हेन्स

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