Name এমভি` সহ একটি ফাইলনেলে একটি নতুন লাইন যুক্ত করুন `


11

এটি একটি গুরুতর প্রশ্ন। আমি কিছু awkস্ক্রিপ্ট পরীক্ষা করি এবং তাদের নামে একটি নতুন লাইন সহ আমার ফাইল দরকার।


একটি ফাইলনাম দিয়ে একটি নতুন লাইন যুক্ত করা সম্ভব mv?

আমি এখন, আমি এটি দিয়ে এটি করতে পারি touch:

touch "foo
bar"

স্পর্শ সহ আমি অনুলিপি এবং পেস্ট প্রতি নতুন লাইন অক্ষর যুক্ত। তবে আমি fooReturnbarআমার শেল লিখতে পারি না ।

ফাইলনামে একটি নতুন লাইন রাখতে আমি কীভাবে একটি ফাইলের নাম পরিবর্তন করতে পারি?


2015/06/28 সম্পাদনা করুন; 07:08 পিএম

zshআমি একটি নতুন লাইন যুক্ত করতে ব্যবহার করতে পারি, Alt+Return


2
কেন জিজ্ঞাসা করছ? আপনি কি কোনও বন্ধুর সাথে কিছু রসিকতা বা কৌশল করছেন?
বাসিল Starynkevitch

2
প্রশ্নটি সরিয়ে ফেলবেন না, এটি দরকারী। তবে যতটা সম্ভব ফাইলের নামগুলিতে নতুন লাইনগুলি এড়িয়ে চলুন।
বেসিল স্টারিনকিভিচ

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, ইত্যাদি ... বিশদগুলি আপনার শেলের সাথে সুনির্দিষ্ট are আমি ব্যবহার করছি 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
@এবং (প্রথম অবস্থার মতো) বা এর ,চেয়েও বেশি ক্ষতিকারক হবে । এই সমস্ত রিকোমেন্ডেশনগুলি মূলত কিছু অ্যাপ্লিকেশনগুলিতে বাগের চারপাশে কাজ করার জন্য (যা ফাইলের নামগুলিতে বিরতি দেয় যা অন্যথায় ওএসের দৃষ্টিকোণ থেকে বৈধ হয়)। লোকেরা তাদের বাগগুলি ঠিক করার পরিবর্তে এই অক্ষরগুলি ব্যবহার না করার জন্য জিজ্ঞাসা করে feels -%
স্টাফেন চেজেলাস

19

আপনি যদি ব্যাশ ব্যবহার করেন তবে এই কমান্ডটি কাজ করা উচিত।

mv a $'b\nc'

4
zshএছাড়াও সাথে কাজ করে =)
এবি

3
জ্যাশ এবং ফ্রিবিএসডি এস-এর মতো বাশ, ksh93 থেকে অনুলিপি করেছে।
স্টাফেন চেজেলাস

আপনাকে অনেক ধন্যবাদ! আমি সম্পূর্ণই, $ ব্যাশ সম্পর্কে ভুলে গেছি যখন এটি তাই এটি ব্যবহার পরামর্শ আমার নিজের উত্তর - 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- এবং শেল সম্পর্কে কেবল সামান্যই। সমস্যাটি হ'ল কোনও মানক হিসাবে, প্রচলিত tty বেশিরভাগ সময় কার্নেলের tty শৃঙ্খলা আপনার ইনপুটটিকে বাফার করে চলেছে - কেবল এটি আপনার স্ক্রিনে প্রতিধ্বনিত করে এবং অন্য কোথাও নেই - যাতে এটি দক্ষতার সাথে ব্যাকস্পেসিং এবং এর মতো-যেমন পরিচালনা করতে পারে।

যাইহোক, আপনি যখন রিটার্ন টিপুন বা অন্যথায় একটি নতুন লাইন প্রবেশ করুন, তখন সেই সমস্ত বাফার ডেটা একবারে পঠন অ্যাপ্লিকেশনটিতে ধাক্কা দেয় - সাধারণত আপনার শেল। $PS2ঝুঁকির উক্তিটি প্রবেশ করার পরে আপনি এটি পর্যবেক্ষণ করতে পারেন । শেলটি যখন এটি মুদ্রণ $PS2করে কারণ এটি কেবল আপনার ইনপুটটির কিছু ব্লক পড়েছে এবং এখনও আপনি নিশ্চিত হয়ে উঠছেন না যে আপনি এটি পেরিয়ে গেছেন।

সুতরাং, সুবিধার জন্য, আপনার যা দরকার তা হ'ল \nটার্মিনাল বাফারে একটি ইলাইন পাঠানোর কিছু উপায় অবিলম্বে অন্য সমস্ত ইনপুটটি ধাক্কা না করে। এটি করার মানক উপায় হ'ল ডাব্লু / কী-সিকোয়েন্স CTRL+V- যা আপনার পরবর্তী ইনপুট চরিত্রটির টার্মিনালের জন্য উদ্ধৃতি দেয়। কি CTRL+Vতারপর CTRL+J- কারণ আধুনিক সাধারণত একটি আক্ষরিক টাইপ করতে কেমন \newline। আপনি জানেন না যে এটি কাজ হয়েছে যখন আপনি দেখতে পাবেন না $PS2কারণ শেলটি এখনও আপনার ইনপুটটি পড়েনি।

নোট যে যদিও এটা নেই পড়ি যে ইনপুট আপনার আগের CTRL+Vসব সময়ে শেল জন্য কোন পার্থক্য করেছেন হবে - যে শুধুমাত্র লাইন শৃঙ্খলা জন্য এটি উদ্ধৃতি। আপনি অবশ্যই নতুন লাইনের শেল-উদ্ধৃতি দিয়ে এর সাথে অর্থপূর্ণ কিছু করতে চাইবেন।

উপায় দ্বারা, CTRL+Vকার্যকরভাবে অন্যান্য উপায়ে প্রয়োগ করা যেতে পারে - উদাহরণস্বরূপ শেল স্ক্রিপ্টে "$(printf \\33)"একটি ESCঅক্ষর লেখার একমাত্র উপায় নয় - এবং এটি এমনকি সবচেয়ে সহজও নয়। আপনি যদি প্রথমে এভাবে চালিয়ে যান তবে আপনার কীবোর্ড কোনও অক্ষর প্রবেশ করতে পারে ইনপুট ড্রাইভার এটি ব্যাখ্যা করার চেষ্টা না করেই ব্যাখ্যা করতে পারে।

আমি প্রায়শই শেলটি কোনও কিছুই সম্পন্ন করার চেষ্টা না করে কমান্ড-লাইনে <tab> গুলি ব্যবহার করতে চাই। যেহেতু সমাপ্তি শেলগুলি সাধারণত stty eol \tতাদের সমাপ্তির সিস্টেমগুলি কাজ করতে <tab> এর সমার্থক উপায়ে কনফিগার করে , CTRL+Vএমনকি অপরিচিত পরিবেশেও আমার পক্ষে কাজ করে।


2
'Ctrl + V' উল্লেখ করার জন্য আপনাকে ধন্যবাদ। আমি এটি সম্পর্কে উত্তর পোস্ট করতে যাচ্ছি এবং তারপরে আপনার ব্যাখ্যাটি দেখেছি।
আর্টদানিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.