मैं लिनक्स शेल का उपयोग करके रिक्त स्थान के साथ फ़ाइलों का नाम कैसे बदलूं?


28

मैंने उनमें रिक्त स्थान वाली कई फ़ाइलों का नाम दिया है, और मैं अंतरिक्ष को प्रतिस्थापित करना चाहता हूं _। हालाँकि, हर बार जब मैं फ़ाइल नाम (जैसे Spring 2011) के साथ शेल में कमांड लिखता हूं , शेल फ़ाइल या निर्देशिका को नहीं पहचानता है।

इस बारे में क्या किया जा सकता है? क्या किसी अंतरिक्ष के लिए यूनिकोड वर्ण का उपयोग करने का कोई तरीका है?


प्रोग्राम फ़ाइलों का नाम बदलने के bashलिए, लूप के लिए उपयोग करें : यहां मेरा समाधान देखें
ट्रेवर बॉयड स्मिथ

जवाबों:


33

अंतरिक्ष से बच, जैसे Spring\ 2011, या उद्धरण का उपयोग करें, जैसे 'Spring 2011'। भविष्य में, यह आमतौर पर किसी भी * NIX पर रिक्त स्थान के साथ फ़ाइल नाम का उपयोग करने के लिए एक बुरा विचार है।

यदि आपको मिल गया है rename, तो आप इसका उपयोग कर सकते हैं:

rename ' ' '_' [filenames...]

1
क्या आप जानते हैं कि सभी फ़ाइलों के लिए एक ही बार में ऐसा करने के लिए क्या है?

3
यह एक बुरा विचार क्यों है? यह प्रोग्रामर की जिम्मेदारी है कि वह फाइलनेम को ठीक से हैंडल करे।
ग्लेन जैकमैन

1
@ क्राफ्ट, वास्तव में यह त्रुटि है कि फ़ाइल नाम को ठीक से मोर्चा संभालने के लिए नहीं। अतिरिक्त प्रयास तब आता है जब किसी स्क्रिप्ट को डीबग करना होता है जब आप केवल फ़ाइल नाम वाले चर को उद्धृत करना भूल जाते हैं।
ग्लेन जैकमैन

3
यह उत्तर काम नहीं करता है (Ubuntu 12.04 LTS पर, कम से कम)। हालांकि unutbu से जवाब ठीक काम करता है।
डीएनए

1
यह केवल मेरे लिए पहला स्थान था ... जो सहायक नहीं है (मेरे पास renameसंस्करण 2.23 है)
ट्रेवर बॉयड स्मिथ

30

यदि आपकी मशीन का नाम बदलने का आदेश है, तो यह सभी रिक्त स्थान को सभी फ़ाइलों / अंडरस्कोर में वर्तमान कार्य में बदल देगा:

rename 's/ /_/g' *

Ubuntu 12.04 में काम करने की पुष्टि की
एंथोनीगोर

1
मेरे लिए काम नहीं किया ... मुझे "नाम बदलने: पर्याप्त तर्क नहीं" की त्रुटि मिली। मेरे पास संस्करण है rename --version rename from util-linux 2.23.2
ट्रेवर बॉयड स्मिथ

24

यदि आपके पास renameसिर्फ शेल का उपयोग करना या करना पसंद नहीं है :

for f in *\ *; do mv "$f" "${f// /_}"; done

टूटा:

  • *\ *forलूप के लिए इनपुट के रूप में उनके नाम की एक जगह के साथ सभी फाइलों का चयन करता है ।
  • आसपास के उद्धरण "$f"महत्वपूर्ण हैं क्योंकि हम जानते हैं कि फ़ाइल नाम में एक स्थान है और अन्यथा यह 2+ तर्क के रूप में दिखाई देगा mv
  • ${f//str/new_str}एक बैश-विशिष्ट स्ट्रिंग प्रतिस्थापन विशेषता है। सभी उदाहरणों strको बदल दिया जाता है new_str

2
यह काम करता है लेकिन मेरे लिए यह केवल पहले स्थान की जगह लेता है। अगर मैं इसका उपयोग for f in *\ *; do mv "$f" "${f// /_}"; doneकरता हूँ
बिलीन्हो जूल

@billynoah अच्छा कैच, अपडेटेड।
22 अक्टूबर को ब्लाहडाइला जूल

@blahdiblah बहुत बहुत धन्यवाद! आपने मुझे इतना समय बचा लिया!
गुरिल्ला

@blahdiblah आपके समाधान का तरीका मेरे समाधान की तुलना में अधिक सुरुचिपूर्ण है । बहुत बढ़िया। मुझे नहीं लगता था कि लूप ग्लोब काम करेगा ... इसलिए मैंने लूप के लिए ग्लोब बाहर किया।
ट्रेवर बॉयड स्मिथ

3

mv "Spring 2011.file" Spring_2011.file एक इनपुट के रूप में उद्धृत स्ट्रिंग लेने के लिए कमांड-लाइन को बताना चाहिए।


यह एकमात्र उत्तर है जो मुझे काम करने के लिए मिल सकता है।
22

1

प्रोग्राम फ़ाइलों का नाम बदलने के लिए, आप bashलूप के लिए एक सरल का उपयोग कर सकते हैं ।

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

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

ps

यदि आप Bashपैरामीटर विस्तार (यानी ${filename// /_}) से परिचित नहीं हैं, तो आप renameकमांड का उपयोग कर सकते हैं :

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.