কোনও ফাইলের অন্যটিতে পুনর্নির্দেশ করা কি কোনও ইউইউসি (বিড়ালের অকেজো ব্যবহার)?


36

আমি যদি বিষয়বস্তুগুলির সাথে file2মেলে বিষয়বস্তুগুলি তৈরি করতে চাই file1, তবে আমি কেবল চালাতে পারি cp file1 file2

যাইহোক, যদি আমি সংরক্ষণ করতে ইচ্ছুক সবকিছু সম্পর্কে file2 ব্যতীত বিষয়বস্তু-মালিক, অনুমতি বর্ধিত গুণাবলীর ACLs, হার্ড লিঙ্ক, ইত্যাদি, ইত্যাদি, তারপর আমি চালাতে না চায় cp। * যে ক্ষেত্রে আমি শুধু টুপ করতে চান বিষয়বস্তু file1মধ্যে file2

মনে হচ্ছে নীচেরগুলি এটি করবে:

< file1 > file2

কিন্তু এটি কাজ করে না। file2কিছুতেই কেটে যায় এবং লিখিত হয় না। যাহোক,

cat < file1 > file2

কাজ করে

এটি আমাকে বিস্মিত করেছে যে প্রথম সংস্করণটি কাজ করে না।

দ্বিতীয় সংস্করণটি কি ইউইউওসি? কেবল কোনও পুনর্নির্দেশগুলি ব্যবহার করে কোনও আদেশ না দিয়ে এই উপায় করার কী উপায় আছে?

দ্রষ্টব্য: আমি সচেতন যে UUOC সত্যিকারের অ্যান্টি-প্যাটার্নের চেয়ে বেশি পেডেন্টিক পয়েন্ট।

* হিসাবে tniles09 আবিষ্কৃত , cp ইচ্ছা এই ক্ষেত্রে সত্য কাজে।


3
কিনা < file1 > file2তুমি কি চাও শেল-নির্ভরশীল নয়।
মাইকেল হোমার

13
ওয়েল, এটা হল এর একটি নিষ্প্রয়োজন ব্যবহারের <...
jwodder

2
একটি বিরোধী প্যাটার্ন কি?
মাইকজার্ভ

6
@jwodder - এটি সত্য নয়। বিশেষত যখন আপনি একটি অনুলিপি সম্পর্কে কথা বলছেন যখন file1অস্তিত্ব নেই বা অন্যটি অপঠনযোগ্য তখন কী ঘটে যায় তা বিবেচনা করুন এবং আউটপুট খোলার < আগে আপনি এটিটি খুলুন >এবং তারপরে আপনি যখন catএটি খোলার চেষ্টা করবেন তখন কী ঘটে তা বিবেচনা করুন।
মাইক্রজারভ

3
@ জোনাথনলফলার জেডএস-এ একটি ফাঁকা কমান্ড পুনর্নির্দেশের অনুরোধ সহ cat(ডিফল্টরূপে) মূলত দ্বিতীয় কমান্ড চালাচ্ছেন। দেখুন Stéphane Chazelas 'উত্তর একটি মন্তব্য মধ্যে ফিট করে চেয়ে যে আরো অনেক কিছুর জন্য কম।
মাইকেল হোমার

উত্তর:


58

cat < file1 > file2কোনও ইউইওসি নয়। ধ্রুপদীভাবে <এবং >পুনর্নির্দেশগুলি করুন যা সিস্টেম স্তরে বর্ণনাকারীর নকল ফাইলের সাথে সম্পর্কিত correspond ফাইল ডেস্ক্রিপ্টর ডুপ্লিকেশনগুলি নিজেরাই কোনও কাজ করে না (ভাল, >পুনর্নির্দেশগুলি এর সাথে খোলা থাকে O_TRUNC, যাতে সঠিক হতে পারে, আউটপুট পুনর্নির্দেশগুলি আউটপুট ফাইলকে ছিন্ন করে)। < >প্রতীকগুলি আপনাকে বিভ্রান্ত করতে দেবেন না । পুনর্নির্দেশগুলি ডেটা সরায় না — তারা ফাইল বিবরণকারীকে অন্যান্য ফাইল বর্ণনাকারীর কাছে নিযুক্ত করে।

এই ক্ষেত্রে আপনি খুলতে file1এবং ফাইল বর্ণনাকারী যে ফাইল বর্ণনাকারী বরাদ্দ 0( <file1== 0<file1) এবং file2এবং ফাইল বর্ণনাকারী যে ফাইল বর্ণনাকারী বরাদ্দ 1( >file2== 1>file2)।

এখন আপনি দুটি ফাইল বর্ণনাকারী পেয়েছেন, আপনি দুটি between এর মধ্যে ডেটা বেলন করার জন্য একটি প্রক্রিয়া প্রয়োজন এবং catএটিই এর জন্য।


11
হতে পারে এটি কেবল আমিই, তবে এই উত্তরের আমার প্রিয় অংশটি হ'ল "বেলচা" শব্দটি আপনার ব্যবহার। :) খুব পরিষ্কার, আপনাকে ধন্যবাদ।
ওয়াইল্ডকার্ড

1
@ উইল্ডকার্ড আমি "বেলচা" এর চেয়ে "পাম্প" পছন্দ করতাম তবে এখনও একটি ভাল শব্দ। +1
মেহরদাদ

বেলচা ভাল শব্দ কেন?
বুবকজৌবা

1
কেউ বাফারের মাধ্যমে ডেটা অনুলিপি করার সাথে সাথে একটি গাদা গাদা, একবারে একটি শ্যাওল পূর্ণ, একটি গাদা থেকে অন্য গাদা থেকে আলাদা হয়ে যায়। এটি একটি ভাল উপমা।
বিএসডি

1
আপনার প্রথম বাক্যে, আপনি বলেছেন যে ফাইল বর্ণনাকারীদের নকল করা হচ্ছে। এগুলি কি নকল করা হয়েছে বা পুনরায় নিয়োগ দেওয়া হচ্ছে (আপনার দ্বিতীয় অনুচ্ছেদ হিসাবে, এবং বৈশিষ্ট্যের আচরণটি, ইঙ্গিত বলে মনে হচ্ছে)?
গ্রেগ বেল

17

এটি নয়, কারণ অন্যরা যেমন উল্লেখ করেছে, প্রশ্নের আচরণ শেল-নির্ভর। আপনি যেমন (ওপি) নির্দেশ করেছেন, এটি কিছুটা পেডেন্টিক , এমনকি মজারও হতে পারে ? , বিষয় সাজানোর।

যাইহোক, গনুহ সিস্টেমে, আপনার প্রারম্ভিক প্রতিজ্ঞা আরেকটি সমাধান প্রাপ্তিসাধ্য আছে: cp --no-preserve=all file1 file2। এটি ব্যবহার করে দেখুন, আমি মনে করি এটি আপনার বর্ণিত পরিস্থিতি পূরণ করবে (উদাহরণস্বরূপ file2এর বৈশিষ্ট্যগুলিকে সংশোধন না করার সময় সামগ্রীর সংশোধন)।

উদাহরণ :

$ ls -l
    total 8
    -rw-r--r-- 1 tniles sambashare 16 Dec 16 12:21 fezzik
    -rw-r--r-- 1 tniles tniles     14 Dec 16 12:16 fred
$ cat *
    Lookout, world!
    Hello, world!
$ cp --no-preserve=all fred fezzik 
$ ls -l
    total 8
    -rw-r--r-- 1 tniles sambashare 14 Dec 16 12:22 fezzik
    -rw-r--r-- 1 tniles tniles     14 Dec 16 12:16 fred
$ cat *
    Hello, world!
    Hello, world!

আপডেট আপডেট আসলে, আমি সবেমাত্র লক্ষ্য করেছি যে আমার সিস্টেমটি cpনিজে থেকেই বৈশিষ্ট্যগুলি সংরক্ষণ করে বলে মনে হচ্ছে -aবা -pনির্দিষ্ট না করা আছে। আমি ব্যাশ শেল এবং জিএনইউ কোর্টিল ব্যবহার করছি। আমি আপনি প্রতিদিন নতুন কিছু শিখতে অনুমান...


হার্ড লিঙ্ক এবং বিভিন্ন অনুমতি সহ পরীক্ষার ফলাফল (ওয়াইল্ডকার্ড দ্বারা):

$ ls -li
total 12
913966 -rw-rw-r-- 1 vagrant vagrant 30 Dec 16 20:26 file1
913965 -rwxrw---- 2 pete    vagrant 39 Dec 16 20:35 file2
913965 -rwxrw---- 2 pete    vagrant 39 Dec 16 20:35 hardlinktofile2
$ cat file1
This is the contents of file1
$ cat file2
This is the original contents of file2
$ cp file1 file2
$ ls -li
total 12
913966 -rw-rw-r-- 1 vagrant vagrant 30 Dec 16 20:26 file1
913965 -rwxrw---- 2 pete    vagrant 30 Dec 16 20:37 file2
913965 -rwxrw---- 2 pete    vagrant 30 Dec 16 20:37 hardlinktofile2
$ cat file1
This is the contents of file1
$ cat file2
This is the contents of file1
$ 

খুশী হলাম। একটি হার্ড লিঙ্ক এবং বিভিন্ন অনুমতি সহ আমি নিজের পরীক্ষা চালিয়েছি এবং মনে হচ্ছে আপনি সঠিক।
ওয়াইল্ডকার্ড

আমার পরীক্ষার ফলাফল যুক্ত করেছে; আশা করি আপনি কিছু মনে করবেন না :) আমি এসিএল বা বর্ধিত বৈশিষ্ট্যগুলি পরীক্ষা করি নি তবে এই ইনোড নম্বরটি সংরক্ষণ করা হয়েছে আমি 99% নিশ্চিত সেগুলিও থাকত।
ওয়াইল্ডকার্ড

সুন্দর ... কিছু মনে করবেন না। :-)
টাইলস

13

ইন zsh, শেল যেখানে < file1 > file2কাজ করে সেখানে শেলটি ডাকে cat

একটি কমান্ড লাইন যেটি শুধুমাত্র পুনঃনির্দেশগুলি এবং কোন কমান্ড কিংবা বরাদ্দকরণ, নিয়ে গঠিত জন্য zshপূজা $NULLCMD( catডিফল্ট অনুসারে) যদি না শুধুমাত্র ফেরৎ একটি হল <যা কেস এক $READNULLCMD( pagerডিফল্ট অনুসারে) পরিবর্তে প্রার্থনা করা হয়। (এটি যদি zshনা থাকে shবা cshঅনুকরণ না হয় তবে যে ক্ষেত্রে এটি শেলগুলি অনুকরণ করে তার মতো আচরণ করে)।

তাই:

< file1 > file2

আসলে হিসাবে একই

cat < file1 > file2

এবং

< file1

এটার মতই

pager < file1

রেকর্ডের জন্য, এই সিনট্যাক্সটি ksh93
fpmurphy

8
< from > to

কোনও আদেশ নেই বলে কাজ করে না; কোন প্রক্রিয়া। শেলটি ফাইলগুলি খোলে / তৈরি করে এবং পুনঃনির্দেশগুলি ব্যবস্থা করে (যার অর্থ এই ফাইলগুলির উল্লেখকারী ফাইল বর্ণনাকারীরা 0 এবং 1: স্ট্যান্ডার্ড ইনপুট এবং স্ট্যান্ডার্ড আউটপুট হিসাবে রোপণ করা হয়েছে)। স্ট্যান্ডার্ড ইনপুট থেকে পড়তে এবং স্ট্যান্ডার্ড আউটপুটে লেখার জন্য লুপ চালানোর মতো কিছুই নেই।

zshএই "নাল কমান্ড" কেসটিতে একটি ব্যবহারকারী-কনফিগারযোগ্য কমান্ড স্থাপন করে এই কাজটি করে। কমান্ড লাইনে কমান্ডটি দৃশ্যমান নয়, তবে এটি এখনও রয়েছে। এর জন্য একটি প্রক্রিয়া তৈরি করা হয় এবং এটি একইভাবে কাজ করে। NULLCMDহয় catতাই হয়, ডিফল্টরূপে < from > toআসলে মানে cat < from > to মধ্যে zsh, যদি না NULLCMDঅন্য কিছু সেট করা হয়; এটি একটি "অন্তর্নিহিত বিড়াল" কমান্ড।

একটি "বিড়ালের অকেজো ব্যবহার" দেখা দেয় যখন catকোনও ফাইল থেকে পড়তে এবং ডেটাটিকে অন্য প্রক্রিয়াতে ফিড করার জন্য মধ্যস্থতাকারী হিসাবে ব্যবহৃত হয়, যার ফাইল বিবরণীটি কেবলমাত্র মূল ফাইলের সাথে সংযুক্ত থাকতে পারে।

যদি catপরিস্থিতি থেকে অপসারণযোগ্য, যেমন অবশিষ্ট কমান্ডগুলি এখনও একই কাজ সম্পাদন করতে পারে তবে এটি অকেজো। যদি এটি অপসারণযোগ্য না হয় তবে এটি অকেজো নয়।

# useless, removable:
$ cat archive.tar | tar tf -    #  -->  tar tf archive.tar

# not removable (in POSIX shell):
$ cat > file
abc
[Ctrl-D]

# likewise:
STRING=$(cat file)

একজন catযে replacable একই জিনিস নয়। উদাহরণস্বরূপ পরিবর্তে cat > fileআমরা vi fileফাইল তৈরি করতে ব্যবহার করতে পারি । এটিকে অপসারণ হিসাবে গণ্য করা হয় না cat, একই কাজ অর্জনের জন্য যা অবশিষ্ট রয়েছে তা ব্যবহার করার সময়।

যদি catহয় শুধুমাত্র অবশ্যই এটা সরানো যাবে না, পাইপলাইন কমান্ড তারপর; যা কিছু বাকি রয়েছে তার কোনও পুনর্বিন্যাস সমান কাজ করবে না।

কিছু শেল স্ক্রিপ্টার ব্যবহার করে catকারণ তারা মনে করে যে এটি কমান্ড লাইনের বাম পাশের ইনপুট অপারেন্ডকে সরাতে দেয়। তবে, কমান্ড লাইনে পুনর্নির্দেশগুলি যে কোনও জায়গায় হতে পারে:

# If you're so inclined:
# move source archive operand to the left without cat:
$ < archive.tar tar xf - > listing

বিটিডব্লিউ, আপনাকে টারের জন্য ব্যবহার করতে হবে না f -tar xf -ঠিক হয় tar x
dnt

@ মিমক্জারভেজ এটি কোথায় বলবে যে catএটি ফাইল তৈরিতে জড়িত? উত্তর পরিষ্কারভাবে বলে যে শেল এটি করে। কোন সমস্যার সাথে > fileআপনি উল্লেখ করছেন? আমি প্রায়শই এটি কোনও বিদ্যমান ফাইলকে শূন্য দৈর্ঘ্যে ছাঁটাই বা এ জাতীয় উপস্থিতি নিশ্চিত করার জন্য ব্যবহার করি। এই প্রশ্নটি কেন < from > toএমনভাবে কাজ করে না cat < from > toএবং ইউইউসি সম্পর্কে নয়, "দয়া করে আমাকে কারণগুলির জন্য কেন catভাল বিকল্প নয় কেন তা নয় cp" not
কাজ

1
@ ডিএনটি, tarহ'ল টেপ আরকিভার । অনেকগুলি tarবাস্তবায়ন এখনও ডিফল্টরূপে প্রথম টেপ ডিভাইসের সাথে কাজ করে।
স্টাফেন চেজেলাস

1

< file1 > file2 শেল-নির্ভর বলে মনে হচ্ছে, zsh এ এটি কাজ করে, বাশ নয়।

সম্পাদনা: মিথ্যা বিবৃতি মুছে ফেলা হয়েছে


cp -aগুণাবলীর অপরিবর্তিত file1 এবং মুছে ফেলা হয় file2 গুণাবলীর। কাঙ্ক্ষিত আচরণের বিপরীতে। প্লাস আমি হার্ড লিঙ্কগুলির সাথে কী হবে সেই ম্যান পৃষ্ঠাটি দেখেও বলতে পারি না, তবে আমি মনে করি এটি নিরাপদে আছে যে ফাইল 2 এর হার্ড লিঙ্কগুলি সংরক্ষণ করা হবে না
ওয়াইল্ডকার্ড

আপনি ঠিক বলেছেন, আমি যথেষ্ট মনোযোগ দিয়ে প্রশ্নটি পড়িনি।
tastytea

1

সব ভাল উত্তর উপরন্তু, আপনি একটি UUOC এড়াতে পারেন simulating একটি cat:

awk 1 file1 > file2   # For line-oriented text, not binaries.
dd if=file1 of=file2  # Works for binary files, too.
# many more geeky ways.

এই কমান্ডগুলি ফাইল মেটা ডেটা অনুলিপি করে না, প্লেইন হিসাবে cp


সত্য, তবে এটি উল্লেখ করার মতো যে তাদের কোনও সুবিধা নেই এবং কেবল ত্রুটি (পারফরম্যান্স, নির্ভরযোগ্যতা) শেষ হয়েছে cat। দুটি ফাইল বর্ণনাকারীর মধ্যে ডেটা সরাতে আপনার একটি কমান্ডের দরকার নেই এবং এটির catজন্য সেরা একটি। ফিফোসের জন্য যা লিনাক্সে pvব্যবহার করতে সক্ষম হবে তা দেখুন splice()(যদিও এটি জিএনইউর fadvise(POSIX_FADV_SEQUENTIAL)মতো করে না cat)।
স্টাফেন চেজেলাস

ddবাইনারি ফাইলগুলির জন্য কমান্ড ভাল মনে ... অথবা হবে catবাইনারি ফাইল জন্য ভাল হিসাবে শুধু কাজ?
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড catবাইনারি ফাইলগুলির জন্যও কাজ করে (ইউনিক্স সাধারণত পার্থক্য করে না; তবে কিছু সরঞ্জাম বিশেষত লাইন বাই লাইনে কাজ করে যেমন অর্ড, গ্রেপ, ডব্লিউসি, ... পসিক্সও সর্বনিম্ন বৃহত্তম লাইন দৈর্ঘ্যকে সংজ্ঞায়িত করে, তাই তত্ত্বের ক্ষেত্রে একটি লাইন-ভিত্তিক সরঞ্জাম অত্যধিক বড় লাইনের সাথে চুক্তি করতে অস্বীকার করতে পারে))
জেনস

2
@ স্টাফেনচাজেলাস এই উত্তরটি জিহ্ব-ইন-গাল হিসাবেও করা হয়েছিল। দেখে মনে হচ্ছে, theতু থাকা সত্ত্বেও কিছু লোক মজাদার ক্ষেত্রে অ্যালার্জিযুক্ত (আপনার দিকে নির্দেশিত নয়; আমি আপনার শেল দক্ষতার এবং ওপেনগ্রুপ স্ট্যান্ডার্ড কাজের মূল্যকে মূল্য দিয়েছি)।
জেনস 21

sed '' < file1 > file2;-)
ডিজিটাল ট্রমা

0

যদি এটি কাজ করে তবে এটি ঠিক করবেন না।

আমি ব্যবহার করব

cat < file1 > file2

এবং শব্দার্থবিজ্ঞানের পিসি ঘাম না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.