`Mv` के साथ एक फ़ाइल नाम में एक नई रेखा जोड़ें


11

यह एक गंभीर सवाल है। मैं कुछ awkस्क्रिप्ट्स का परीक्षण करता हूं और मुझे उनके नामों में एक नई रूपरेखा के साथ फाइलों की आवश्यकता होती है।


क्या फ़ाइल नाम में एक नई रेखा जोड़ना संभव है mv?

अब मैं इसके साथ कर सकता हूं touch:

touch "foo
bar"

स्पर्श के साथ मैंने कॉपी और पेस्ट के अनुसार नई लाइन वर्ण जोड़ा। लेकिन मैं fooReturnbarअपने खोल में नहीं लिख सकता ।

फ़ाइल में नाम बदलने के लिए मैं किसी फ़ाइल का नाम कैसे बदल सकता हूं?


संपादित करें 2015/06/28; 07:08 बजे

zshI में एक नई पंक्ति जोड़ने के लिए, Alt+ का उपयोग कर सकते हैंReturn


2
तुमने क्यों पूछा? क्या आप किसी दोस्त के लिए कुछ मजाक या चाल चल रहे हैं?
बासिल स्टारीनेविच 11

2
प्रश्न को न निकालें, यह उपयोगी है। लेकिन वास्तव में जितना संभव हो फाइलनेम में नई लाइनों से बचें।
बेसिल स्टारीनेविच 11

2
आपको क्या लगता है कि इसे करने के साथ mvकोई भी इसे करने से अलग होगा touch? क्या आपने भी यही कोशिश की थी?
केविन

2
ठीक है, आप mvकमांड को कॉपी और पेस्ट कर सकते हैं जितनी आसानी से touch
केविन

2
तो मैं आपको अपने ओपी को और अधिक स्पष्ट रूप से तैयार करने का सुझाव देता हूं: एक दिए गए शेल वातावरण के भीतर मैं एक उद्धृत स्ट्रिंग के भीतर एक नई टाइप नहीं कर सकता जैसा कि इको "ए [रिटर्न] बी"।
दान

जवाबों:


22

यह एक बुरा विचार है (फ़ाइल नामों में अजीब अक्षर हैं) लेकिन आप कर सकते हैं

 mv somefile.txt "foo
 bar"

(आप भी कर सकते थे mv somefile.txt "$(printf "foo\nbar")"या mv somefile.txt foo$'\n'bar, आदि ... विवरण आपके शेल के लिए विशिष्ट हैं। मैं उपयोग कर रहा हूं zsh)

ग्लोबिंग के बारे में अधिक पढ़ें , उदा ग्लोब (7) । विवरण शेल-विशिष्ट हो सकता है। लेकिन समझें कि /bin/mv (आपके शेल द्वारा) दिया गया है, निष्पादित (2) के माध्यम से , तर्कों का एक विस्तारित सरणी: तर्क विस्तार और ग्लोबिंग , इन्वोकिंग शेल की जिम्मेदारी है।

और आप भी ऐसा करने के लिए एक छोटे सी प्रोग्राम को कोड कर सकते हैं:

#include <stdio.h>
#include <stdlib.h>
int main() {
  if (rename ("somefile.txt", "foo\nbar")) {
     perror("rename somefile.txt");
     exit(EXIT_FAILURE);
  };
  return 0;
}

कार्यक्रम में ऊपर सहेजें foo.c, इसे gcc -Wall foo.c -o foo तब संकलित करें./foo

इसी तरह, आप पर्ल, रूबी, पायथन, ओकेमेल, आदि में एक समान स्क्रिप्ट कोड कर सकते हैं।

लेकिन यह एक बुरा विचार है। फ़ाइल नाम में नई कहानियों से बचें (यह उपयोगकर्ता को भ्रमित करेगा, और यह कई स्क्रिप्टों को तोड़ सकता है)।

वास्तव में, मैं फ़ाइल पथों में केवल गैर-उच्चारण अक्षरों, अंकों और +-/._% वर्णों ( /निर्देशिका विभाजक होने के साथ ) का उपयोग करने की सलाह देता हूं । "छिपी" फाइलों (शुरुआत के साथ .) का उपयोग सावधानी और पंगुता के साथ किया जाना चाहिए। मेरा मानना ​​है कि फ़ाइल नाम में किसी भी तरह की जगह का उपयोग करना एक गलती है। इसके बजाय अंडरस्कोर (उदा foo/bar_bee1.txt) या माइनस (उदा foo/bar-bee1.txt) का उपयोग करें


हां, मुझे पता है, कि मैं एक नई पंक्ति को कॉपी और पेस्ट कर सकता हूं, लेकिन मैं इसे कॉपी और पेस्ट के बिना कैसे कर सकता हूं?
एबी

4
यहां कोई कॉपी या पेस्ट नहीं है। इसके बाद टाइप की गई नई लाइन है foo
दान

हालाँकि यह इसे कॉपी-पेस्ट करने का काम भी करता है
कोस

1
यह सामान्य फ़ाइलों के लिए एक बुरा विचार है, लेकिन एक अच्छा परीक्षण मामला है, जैसा कि ओपी ने उल्लेख किया है।
अर्दतनिल

5
@और (पहली स्थिति की तरह) की ,तुलना में अधिक हानिरहित होगा -या %। वे सभी पुनर्संयोजन मुख्य रूप से कुछ अनुप्रयोगों में बग्स के आसपास काम करने के लिए हैं (जो फ़ाइल नाम पर टूटते हैं जो अन्यथा ओएस के दृष्टिकोण से मान्य हैं)। लोगों को यह पूछने के लिए पिछड़ापन महसूस होता है कि वे अपने कीड़े को ठीक करने के बजाय उन पात्रों का उपयोग न करें।
स्टीफन चेज़लस

19

यदि आप बैश का उपयोग करते हैं, तो यह कमांड काम करना चाहिए।

mv a $'b\nc'

4
के साथ zshभी काम करता है ) =)
AB

3
बाश, जैसे zsh और FreeBSD sh ने ksh93 से नकल की।
स्टीफन चेज़लस

आपका बहुत बहुत धन्यवाद! मैं पूरी तरह से $ bash में भूल गया, जबकि यह SO का उपयोग करने की सलाह देने पर मेरा अपना जवाब था - stackoverflow.com/questions/1825552/grep-a-tab-in-unix/…
antimirov

6

मुझे पता है कि आपने एक mvसमाधान के लिए कहा था , हालांकि, चेतावनी के बावजूद, यह आसानी से rename(पर्ल पैकेज में) किया जा सकता है :

~/tmp$ touch foo
~/tmp$ rename 's/$/\nbar/' foo
Unsuccessful stat on filename containing newline at /usr/share/perl5/File/Rename.pm line 69.
~/tmp$ ls
foo?bar

renameएक बहुत अच्छा विचार के लिए धन्यवाद । +1
एबी

5

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

हालाँकि, जब आप रिटर्न को दबाते हैं या अन्यथा एक नई प्रविष्टि दर्ज करते हैं, तो उस बफ़र किए गए सभी डेटा को एक बार पढ़ने वाले एप्लिकेशन पर धकेल दिया जाता है - आमतौर पर आपका शेल। $PS2झूलते हुए बोली में प्रवेश करने के बाद आप इसका अवलोकन कर सकते हैं । जब शेल प्रिंट $PS2करता है, क्योंकि यह सिर्फ आपके इनपुट के कुछ ब्लॉक को पढ़ता है और अभी तक आप के माध्यम से आश्वस्त नहीं हैं।

इसलिए, सुविधा के लिए, आपको जो कुछ भी चाहिए, \nउसे टर्मिनल बफर में एक ewline भेजने के बिना किसी अन्य इनपुट को तुरंत धक्का देना होगा। ऐसा करने का मानक तरीका w / कुंजी-अनुक्रम है CTRL+V- जो आपके अगले इनपुट चरित्र टर्मिनल के लिए उद्धरण करता है। क्या CTRL+Vतब CTRL+J- क्योंकि बाद आम तौर पर एक शाब्दिक लिखने का तरीका है \newline। आपको पता होगा कि यह तब काम करता है जब आप नहीं देखते हैं $PS2क्योंकि शेल अभी भी आपके इनपुट को नहीं पढ़ पाया है।

नोट कि हालांकि जब यह करता है पढ़ा है कि इनपुट अपने पहले CTRL+Vसब पर खोल के लिए कोई फर्क नहीं बना दिया है जाएगा - कि केवल लाइन अनुशासन के लिए यह उद्धरण। आप निश्चित रूप से न्यूलाइन के साथ-साथ इसके साथ कुछ भी सार्थक करने के लिए शेल-कोट्स करना चाहते हैं।

वैसे, CTRL+Vअन्य तरीकों से उपयोगी रूप से लागू किया जा सकता है - उदाहरण के लिए एक शेल स्क्रिप्ट में एक चरित्र "$(printf \\33)"लिखने का एकमात्र तरीका नहीं है ESC- और यह सबसे सरल भी नहीं है। अगर आप पहली बार इस तरह से बचते हैं तो आप इसकी व्याख्या करने का प्रयास किए बिना किसी भी चरित्र को दर्ज कर सकते हैं।

मैं अक्सर कुछ भी पूरा करने के लिए शेल के बिना कमांड-लाइन पर <tab> s का उपयोग करना पसंद करता हूं। क्योंकि जो गोले पूरे होते हैं, वे आमतौर पर <टैब> को एक तरह से कॉन्फ़िगर stty eol \tकरते हैं, उनके पूरा होने के सिस्टम को काम करने के CTRL+Vलिए समान रूप से अपरिचित वातावरण में भी काम करते हैं।


2
'Ctrl + V' का उल्लेख करने के लिए धन्यवाद। मैं इसके बारे में जवाब पोस्ट करने वाला था और फिर आपका स्पष्टीकरण देखा।
अर्दतनिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.