फ़ाइलनाम से विशेष वर्ण हटाने और निर्देशिका में उनका नाम बदलने के लिए हॉट?


1

अभी तक मेरे पास इतना ही है।

#!/bin/bash

pushd DirectoryName

for file in *.csv; do
    #echo $file
    filename=${file%.*}
    file_clean=${filename//[ ()$+&\.\-\'\,]/_}
    final= "$file_clean.csv"
    mv "$file" $final
done

popd

जवाबों:


2

मैं निम्नलिखित का उपयोग करेगा:

#! /bin/bash
cd DirectoryName
for file in *.csv; do
    filename=${file%.*}
    file_clean=`echo $filename | tr -cs "[:alnum:]_" _ `
    final="$file_clean.csv"
    echo "mv \"$file\" \"$final\" "
done
cd ..

केवल परिवर्तन हैं:

1) पंक्ति में = के बाद एक स्थान था final= "$file_clean.csv"। मैंने इसे हटा दिया है।

2) स्ट्रिंग प्रतिस्थापन कमांड का उपयोग करने के बजाय मैंने कमांड का उपयोग किया है tr। Tr के साथ, -cविकल्प किसी भी वर्ण को बदलने के लिए कहता है जो सेट में नहीं है। इसलिए मैं उन पात्रों को निर्दिष्ट कर सकता हूं जिन्हें मैं (अल्फ़ान्यूमेरिक्स और अंडरस्कोर, इस मामले में) रखना चाहता हूं और अन्य सभी को रूपांतरित किया जाएगा।

यह कुछ और विशेष पात्रों से मेल खाना चाहिए जो प्रत्यक्ष प्रतिस्थापन के माध्यम से निर्दिष्ट करना मुश्किल है, जैसे []\{}और "-sविकल्प का मतलब केवल एक अंडरस्कोर कई पात्रों को दबा भले ही उत्पन्न हो जाएगा कि। इस प्रकार के बजाय abc((((())))).csvमें अनुवाद करता abc_.csvहैabc__________.csv


1
आप के रूप में ही कर सकते हैं 2)बाहरी निष्पादन का उपयोग किए बिना tr: file_clean=${filename//[^[:alnum:]]/_}। आप इस तरह से कई पात्रों के रन दबा सकते हैं:shopt -s extglob; file_clean=${filename//+([^[:alnum:]])/_}
डेनिस विलियमसन

ठंडा। मुझे नहीं पता था कि आप bash प्रतिस्थापन में चरित्र वर्ग का उपयोग कर सकते हैं। धन्यवाद।
पैट वालेस

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