ব্যাকআপে ফাইল ফাইল (ফাইলের নাম *) অনুলিপি করুন (ফাইলের নাম * .বাক)


13

পটভূমি

লিনাক্সে আপনি এটি করতে পারেন:

  • এর সাথে ফাইলগুলির একটি গ্রুপ তালিকাবদ্ধ করুন ls Filename*
  • এর সাথে ফাইলগুলির একটি গ্রুপ সরান rm Filename*
  • এর সাথে ফাইলগুলির একটি গ্রুপ সরান mv Filename* /New/Directory
  • তবে আপনি এই ফাইলগুলির একটি গ্রুপ কপি করতে পারবেন না :cp Filename* *.bak

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

নামগুলির এক এক করে না লিখে এবং cpকমান্ডটি ব্যবহার না করেই আমার কাছে একটি গ্রুপের ফাইল অনুলিপি করা উচিত :

$ ls gmail-meta3*
gmail-meta3                          gmail-meta3-REC-1558392194-26467821
gmail-meta3-LAB-1558392194-26467821  gmail-meta3-YAD-1558392194-26467821

আমি কীভাবে পুরানো ডস কমান্ডের মতো কিছু ব্যবহার করতে পারি copy gmail-meta3* *.bak?

আমি চারবার অনুরূপ কমান্ড টাইপ করতে চাই না:

cp gmail-meta3-LAB-1558392194-26467821 gmail-meta3-LAB-1558392194-26467821.bak

আমি এমন একটি স্ক্রিপ্ট / ফাংশন / অ্যাপ্লিকেশন খুঁজছি যা পুরানো এবং নতুন ফাইল নাম গোষ্ঠীর জন্য পরামিতি গ্রহণ করে এবং হার্ড-কোডেড ফাইলের নাম সহ কিছু নয়। উদাহরণস্বরূপ, একজন ব্যবহারকারী টাইপ করতে পারেন:

copy gmail-meta3* *.bak

অথবা তারা টাইপ করতে পারে:

copy gmail-meta3* save-*

1
সমস্যাটি আমার কাছে দু'বার গ্লোব অপারেটর ব্যবহার করছে যা আপনার অন্যান্য কমান্ড ব্যবহার করে না। ব্যাশ এটি পরিচালনা করার জন্য যথেষ্ট স্মার্ট নয়।
qwr

2
@ কিউইউইউআর, বাশ মেটাচার্যাক্টরগুলি প্রসারিত করে এবং মৃত্যুদন্ড কার্যকর করার আদেশকে দেওয়ার আগে ইনপুটটিকে টোকনাইজ করে দেয় এটি ইউএনএক্স শেলের নকশার অংশ। একরকম চেষ্টা এবং প্রোগ্রাম করার জন্য সিপি কমান্ডের ব্যতিক্রম ব্যাসের সম্পূর্ণ ধারাবাহিকতা ভেঙে দেবে, যা মোটেই স্মার্ট হবে না। : একটি ব্যায়াম করে দেখুন এবং চিত্র হিসাবে কি এখানে ঘটছে আউট, এবং এটি যাতে করে তোলে কেন এটা শেল এর metacharacter সম্প্রসারণ হয়touch aa ab ba; mkdir bb; cp a* b*; ls *
মাইক এস

@ মাইকস পয়েন্টারদের জন্য ধন্যবাদ। গতকাল অন্য কেউ বলেছিলেন যে আপনি *উত্স ফাইলের নামের জন্য একটি ওয়াইল্ডকার্ড ব্যবহার করতে পারেন তবে লক্ষ্য ফাইলের নামের জন্য নয়। যেমন বিকল্প ওয়াইল্ডকার্ড হিসাবে (আমার মনে ##হয় প্রস্তাবিত হয়েছিল তবে আমি ঝুঁকে যাচ্ছি %) লক্ষ্য হিসাবে ব্যবহার করতে হবে। আমার মনে হয় এটাই কি আপনি চাঙ্গা করছেন? আমি cpকমান্ডটি মোটেও পরিবর্তন করার আশা করিনি । copyডস কপি কমান্ডটি অনুকরণীয় (যুক্তির মধ্যে) নামে একটি মোড়ক স্ক্রিপ্ট তৈরি করুন ।
WinEunuuchs2Unix

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

... তবে এটি করা কুৎসিত কাজ হবে। একটি বিশেষ চরিত্র ব্যবহার করা ভাল। % বা আন্ডারস্কোর ভাল, তারা সাধারণত মেটাচার্যাক্টর হয় না (তবে ক্রন্টাব ফাইলে% ব্যবহারের ক্ষেত্রে সতর্ক থাকুন; এটি বিশেষ)
মাইক এস

উত্তর:


14

এখানে একটি atypical ব্যবহারের একটি উদাহরণ sed, যা এই কাজের জন্য প্রযোজ্য:

sed -i.bak '' file-prefix*

এইভাবে, আসলে, sedফাইলগুলি পরিবর্তন করবে না, কারণ আমরা কোনও আদেশ সরবরাহ করি নি '', তবে বিকল্পের কারণে -i[suffix]এটি প্রতিটি ফাইলের একটি ব্যাকআপ কপি তৈরি করবে। আমি যখন অনুসন্ধান করছিলাম তখন আমি এই পদ্ধতির সন্ধান করলাম যখন কোনও ফাইলের নাম দু'বার টাইপ না করে ব্যাকআপ কপি তৈরি করার কোনও উপায় আছে কি?


এফওয়াইআই: $ time sed -i.bak '' gmail-meta3*=real 0m0.069s
উইনউইউউকস 2 ইউনিক্স

ফাইল যদি ইতিমধ্যে তারপর বিদ্যমান: real 0m0.037s। তাহলে ফাইল মুছে ফেলা এবং একটি দ্বিতীয় সময় ঘনিষ্ঠ চালানোর cpগতি: real 0m0.051s
WinEunuuchs2Unix

@ xiota একটি আকর্ষণীয় বিষয়। সক্রিয় আউট sedদ্রুততর যখন লক্ষ্য ফাইল ইতিমধ্যেই বিদ্যমান কিন্তু cpধীর যখন লক্ষ্য ফাইল অস্তিত্ব নেই। syncবড় টাইমিং টেস্ট করার চেয়ে আমি প্রকৃতপক্ষে ক্যাশে এবং বাফারগুলি ফ্লাশ করি তবে আমি এবারও করি নি। যেহেতু এটি পুরোপুরি অফ-প্রশ্ন-বিষয় সোপ অপেরাতে রূপান্তর করতে পারে আমি আমার পরীক্ষার ফলাফলগুলি ভাগ করে নেওয়ার জন্য দুঃখিত :( এই কথোপকথনটি কখনও ঘটেনি বলে ভান করতে দেরী হয়? এফওয়াইআই জিমেইল বার্তা মেটাডাটা আকার 2.5 এমবি এবং 3 সূচক ফাইলগুলি প্রায় 800 কেবি এটিও কোনও হার্ডডিস্ক নয়, এটি 4 টি চ্যানেলের স্যামসং প্রো 960 এনভিএম এসএসডি
উইনইনুচস

1
কোনও লিনাক্স মেশিনে যদি এটি ঘটে থাকে তবে সম্ভবত এই পরীক্ষাগুলির জন্য আপনার কাছে কী স্টোরেজ ডিভাইস রয়েছে তা বিবেচ্য নয়। মেমরির ফাইলগুলি বাফার করতে কার্নেলটি অত্যন্ত ভাল। freeকমান্ডটি ব্যবহার করার সময় "বাফ / ক্যাশে" মানটি এটিই । ডিভাইসে প্রকৃত লেখাগুলি একটি অ্যালগরিদম দ্বারা নির্বাচিত মুহুর্তে ঘটেছিল যা মেশিনের ক্যাশে এবং মেমরির চাপের বয়স বিবেচনা করে। আপনি যদি একাধিক পরীক্ষার চেষ্টা করছেন, তবে প্রথম ফাইলটি পড়লে ডিস্কটি চলে আসবে তবে পরবর্তী পাঠগুলি সম্ভবত মেমরির বাইরে চলে আসবে (দেখুন sync; echo 3 > /proc/sys/vm/drop_caches)।
মাইক এস

গতকাল আমি 2 গিগাবাইটের বেশি বড় ফাইল দিয়ে কয়েকটি পরীক্ষা করেছি এবং - হ্যাঁ, এই পদ্ধতিটি cpকমান্ডটি ব্যবহার করার তুলনায় তুলনামূলকভাবে কম , তবে পারফরম্যান্সের কোনও উল্লেখযোগ্য পার্থক্য আছে বলে আমি বলতে পারি না
pa4080

13

আপনি ব্যবহার করতে পারেন find:

find . -max-depth 1 -name 'gmail-meta3*' -exec cp "{}" "{}.bak" \;

এটি বর্তমান ডিরেক্টরিতে .গ্লোব প্যাটার্নের সাথে মিলে যাওয়া নামের সাথে সমস্ত ফাইল সন্ধান করবে (শেল গ্লোব্বিং প্রতিরোধের জন্য প্যাটার্নের একক উদ্ধৃতি বিবেচনা করুন)। পাওয়া প্রতিটি ফাইলের জন্য, এটি cpনাম থেকে নাম.বাক পর্যন্ত কার্যকর হবে। দ্য \; শেষে এটি নিশ্চিত করে যে এটি প্রতিটি ফাইল একবারে পাস করার পরিবর্তে পৃথকভাবে প্রতিটি ফাইল করবে। 1 হিসাবে সর্বাধিক গভীরতা কেবল পুনরাবৃত্তির পরিবর্তে কিউরেন্ট ডিরেক্টরি অনুসন্ধান করে।


1
find . -max-depth 1 -name '"$1"'' -exec cp "{}" "{}$2" \;যখন $ 1 উত্স এবং $ 2 এক্সটেনশন হয় তখন কী এটি দিয়ে কাজ করবে ?
WinEunuuchs2Unix

যুক্তিযুক্ত হিসাবে long 2 এর বিকল্প হিসাবে রাখা উচিত। Single 1 টি কৌশলযুক্ত হতে পারে কারণ আমরা একক উদ্ধৃতিতে পরিবর্তনশীল প্রতিস্থাপন করতে পারি না। আমি নিশ্চিত না যে অফ্যান্ডহ্যান্ড তবে প্যাটার্নটি স্ট্রিংয়ে সংরক্ষণ করা হওয়ায় ডাবল কোটে in 1 ব্যবহার করা সম্ভব হতে পারে।
cbojar

11

আপনি একটি forলুপbash ব্যবহার করতে পারেন । সাধারণত, আমি এটি কেবল ওয়ান-লাইনার হিসাবে টাইপ করব কারণ এটি প্রায়শই সম্পাদন করা কোনও কাজ নয়:

for f in test* ; do cp -a "$f" "prefix-${f}.ext" ; done

তবে, আপনার যদি এটির স্ক্রিপ্ট হিসাবে প্রয়োজন হয়:

cps() {
   [ $# -lt 2 ] && echo "Usage: cps REGEXP FILES..." && return 1

   PATTERN="$1" ; shift

   for file in "$@" ; do
      file_dirname=`dirname "$file"`
      file_name=`basename "$file"`
      file_newname=`echo "$file_name" | sed "$PATTERN"`

      if [[ -f "$file" ]] && [[ ! -e "${file_dirname}/${file_newname}" ]] ; then
         cp -a "$file" "${file_dirname}/${file_newname}"
      else
         echo "Error: $file -> ${file_dirname}/${file_newname}"
      fi
   done
}

ব্যবহার অনুরূপ rename। পরীক্ষা করার জন্য:

pushd /tmp
mkdir tmp2
touch tmp2/test{001..100}     # create test files
ls tmp2
cps 's@^@prefix-@ ; s@$@.bak@' tmp2/test*    # create backups
cps 's@$@.bak@' tmp2/test*    # more backups ... will display errors
ls tmp2
\rm -r tmp2                   # cleanup
popd

এফওয়াইআই: $ time for f in gmail-meta3* ; do cp -a "$f" "${f}.bak" ; done=real 0m0.046s
উইনউইউউকস 2 ইউনিক্স

উম না আমি সময়ের জন্য অনুকূলিত করতে চাই না। এটি 0.046সেকেন্ড যা মানব উপলব্ধি জন্য 0 সেকেন্ড মানে। আমি কেবল দেখানোর চেষ্টা করছিলাম যে আমি কীভাবে পোস্ট করা উত্তরগুলি পরীক্ষা করে দেখছি এবং sedউপরের কমান্ডটি দেখে এমন দর্শকদের কাছে আকর্ষণীয় খবরটি দিয়ে যাচ্ছি । বা কমপক্ষে আমি তুলনা sedকরতে আগ্রহী ছিলাম cp....
উইনউনুউস 2 ইউনিক্স

আপনার সমাধানটি যদিও cpসমাধানের চেয়ে দ্রুত sed। সুতরাং এটি উদযাপনের কারণ :)
WinEunuuchs2Unix

(1)  -aএকটি মানহীন পরীক্ষার অপারেটর। কেন ব্যবহার -eকরবেন না ? (২) "অস্থায়ী ডিরেক্টরি তৈরি করতে অক্ষম।" কিছুটা বিভ্রান্তিকর ত্রুটি বার্তা। (3) কেন শুধু ব্যবহার mktemp -dকরবেন না ? (4) আপনার প্রস্থান স্থিতি পরীক্ষা করা উচিত। উদাহরণস্বরূপ, আপনার বলা উচিত ! mkdir "$FOLDER" && echo "Unable to create temporary directory." && return 1 বা  mkdir "$FOLDER" || { echo "Unable to create temporary directory."; return 1;}। অনুরূপভাবে cpএবং  rename(এবং এমনকি এমনকি pushd, আপনি যদি সাবধান হতে চান) ... (Cont'd)
জি-ম্যান বলেছেন 'পুনর্বহাল মনিকা'

(চালিয়ে যাওয়া) ... (5) আরগগঃহ! বলো না $@; বলুন "$@"। (5B)  ব্যবহার করার কোনও প্রয়োজন নেই {এবং } আপনি ভেরিয়েবল পথ করছ রেফারেন্স (যখন "${FOLDER}",  "${PATTERN}" এবং  "${file}"); শুধু কর "$FOLDER",  "$PATTERN" এবং  "$file"। ()) এটি ধরে নেয় যে ফাইলগুলি বর্তমান ডিরেক্টরিতে রয়েছে।  cps 's/$/.bak/' d/fooকপি হবে d/fooথেকে foo.bak বর্তমান ডিরেক্টরির মধ্যে, না d/foo.bak
জি-ম্যান

6

ডস দৃষ্টান্তের সবচেয়ে কাছের আপনি সম্ভবত পাবেন mcp( mmvপ্যাকেজ থেকে ):

mcp 'gmail-meta3*' 'gmail-meta3#1.bak'

যদি zshউপলভ্য থাকে তবে এর অবদানের zmvমডিউলটি সম্ভবত কিছুটা কাছাকাছি:

autoload -U zmv

zmv -C '(gmail-meta3*)' '$1.bak'

আমি lsনির্বিশেষে এড়াতে চাই - আপনার নিজের উত্তরের একটি বৈকল্পিক যা হোয়াইটস্পেসের জন্য নিরাপদ (নিউলাইনগুলি সহ) হতে পারে

printf '%s\0' gmail-meta3* | while IFS= read -r -d '' f; do cp -a -- "$f" "$f.bak"; done

অথবা সম্ভবত

printf '%s\0' gmail-meta3* | xargs -0 -I{} cp -a -- {} {}.bak

আমি mmvপ্যাকেজটি বুঝতে পেরেছি কিন্তু মন্তব্যে আপনি কমান্ডটি বলেছিলেন mcpকিন্তু তারপরে আপনি যে কমান্ডটি ব্যবহার করেন mmvতা mmvপ্যাকেজের একটি কমান্ডও । আমি printfউদাহরণগুলির দিকনির্দেশ পছন্দ করি এবং একটি পালিশ স্ক্রিপ্টে আমি নিশ্চিত করতাম যে $ 1 এবং। 2 উত্তীর্ণ হয়েছে। বল রোলিংয়ের জন্য +1 :)
WinEunuuchs2 ইউনিক্স

@ WinEunuuchs2 ইউনিক্স ক্ষমা চেয়েছেন - এমসিপি / মিমিভি একটি মস্তিষ্কের পার্ট ছিল। প্রকৃতপক্ষে mcpকেবল একটি প্রতিশব্দmmv -c
স্টিল্ড্রাইভার

Pfft কোন উদ্বেগ নেই। প্রতিটি টাইপোর জন্য যদি আমার ডলার থাকে আমি কোটিপতি হয়ে যাই :) আমি printfকমান্ডের বিষয়ে স্পষ্টতা চাই যা আমি কখনই ব্যবহার করি নি। আপনি কি বলছেন printf '%s\0' "$1"*যে gmail-meta3প্যারামিটার 1 হিসাবে পাস হলে কাজ হবে ?
WinEunuuchs2 ইউনিক্স

@ WinEunuuchs2 ইউনিক্স আমি সম্ভবত কলিং প্রসঙ্গে গ্লোবালিং করতে দিতাম cps gmail-meta3*এবং তারপরে printf '%s\0"$ @" লিখি | ফাংশনে ... ` অথবা কেবলমাত্র for f; do cp -- "$f" "$f.bak"; done( জিয়োটার উত্তরের মতো , তবে একটি ফাংশন হিসাবে) ব্যবহার করুন
স্টিল্ড্রাইভার

1
দ্রষ্টব্য যে আপনার সাথে zmv"ওয়াইল্ডকার্ড প্রতিস্থাপন" মোডটি ব্যবহার করতে পারেন, যা আমি zmv -W -C 'gmail-meta3*' '*.bak'
কুঁচকানোতে

5

rsync কেবল সমাধান

আপনি যদি কেবল আপনার ফাইলগুলি ব্যাকআপ করতে চান তবে আপনি সেগুলি একটি নতুন ডিরেক্টরিতে অনুলিপি করতে পারেন

rsync /path/to/dir/Filename* /path/to/backupdirectory

এই কপি হবে Filenameথেকে ফাইল /path/to/dir/থেকে /path/to/backupdirectory


rsync + ফাইলনাম

যদি আপনি চান যে আপনার ব্যাকআপ ফাইলগুলিতে একটি প্রত্যয় থাকে তবে জিনিসগুলি এতে হ্যাক হয়ে যায় rsync...

rsync -Iu /path/to/dir/Filename* /path/to/dir/Filename* -b --backup-dir=/path/to/backupdirectory --suffix=.bak

এটি বিদ্যমান ফাইলগুলিকে ওভাররাইট করে ... বিদ্যমান ফাইলগুলি ( -I) দিয়ে তবে কেবল যদি তারা ( -u) নতুন হয় (যা তারা নয়) এবং একটি প্রত্যয় যুক্ত ব্যাকআপ তৈরি করে।

আপনি একই ডিরেক্টরিতে এটি করতে পারেন। তবে বিদ্যমান ব্যাকআপগুলি ভালভাবে বাদ দিন।

rsync -Iu /path/to/dir/Filename* /path/to/dir/Filename* -b --backup-dir=/path/to/backupdirectory --suffix=.bak --exclude '*.bak'


আমি পছন্দ করি rsycncতাই আমি উঁচুতে পেরেছি তবে, একটি সহজ পদ্ধতি হ'ল cp Filename* /path/to/backup/dirকারণ ফাইলগুলি *.bakযদি আলাদা ডিরেক্টরিতে থাকে তবে ইউনিকফায়ারের প্রয়োজন হবে না ।
উইনউইউউকস 2 ইউনিক্স

4

অনুরোধ অনুসারে এটি করা উচিত:

cps(){ p="${@: -1}"; for f in "${@:1:$#-1}"; do cp -ai "$f" "${p//\?/$f}"; done  }

ব্যবহার:

cps FILES... pattern
Example 1: cps gmail-meta3* ?.bak
Example 2: cps * save-?
Example 3: cps * bla-?-blubb

আমি বেছে নিয়েছি ?কারণ #এটি যখন নিদর্শনগুলির প্রথম চরিত্র তখন অবশ্যই উদ্ধৃত করা উচিত, অন্যথায় এটি কোনও মন্তব্যের শুরু হিসাবে স্বীকৃত।

টেস্ট:

$ touch 'test};{bla#?"blubb'
$ cps test* bla-?-blubb
$ ls
test};{bla#?"blubb  bla-test};{bla#?"blubb-blubb


প্রত্যয় যুক্ত করার জন্য স্ক্রিপ্টের পূর্ববর্তী কয়েকটি সংস্করণ:

@ WinEunuuchs2 ইউনিক্স উত্তরের মতো, তবে আমি মনে করি আরও নমনীয় এবং পার্সিং নয়ls :

cps(){ S="$1"; shift; printf '%s\0' "$@" | xargs -0 -I{} cp -abfS "$S" {} {}; }

এটি আপনার মধ্যে রাখুন .bashrc

ব্যবহার:

cps SUFFIX FILES...
Example: cps .bak gmail-meta3*

বিকল্প, (শেষ আর্গুমেন্ট হিসাবে প্রত্যয় সঙ্গে মাধ্যমে এবং এর মাধ্যমে ):

cps(){ S="${@: -1}"; printf '%s\0' "${@:1:$#-1}" | xargs -0 -I{} cp -abfS "$S" {} {}; }

ব্যবহার:

cps FILES... SUFFIX
Example: cps gmail-meta3* .bak


নিস কোডিং কিন্তু এটি ব্যবহারের দশক পর কঠিন ধরনের উত্স তারপর উদ্দিষ্ট সুইচ কপি কমান্ড উদ্দিষ্ট তারপর উত্স
WinEunuuchs2Unix

পিছনে প্রত্যয় সহ ফাংশন যুক্ত করেছে।
পি লুমো

ধন্যবাদ যে আরও স্বজ্ঞাত। আমার উত্তর যেভাবে কোড করেছে এটি এটিকে প্রত্যয় বলা সঠিক তবে এটি সত্যিই একটি লক্ষ্য বা গন্তব্য। অন্যান্য ব্যবহারকারীরা ব্যবহার করতে চান করতে পারেন: copy gmail-meta3* old-meta3*। আমার উত্তরে আমি কীভাবে *আমার প্রশ্নের অনুরোধের মতো গন্তব্য নামটি পেতে পারি তা বুঝতে পারি না ...
WinEunuuchs2Unix

সমস্যাটি *শেল দ্বারা ব্যাখ্যা করা হয়, সুতরাং ফাংশন এটি সম্পর্কে জানতে পারবে না। আপনার অন্য কোনও চরিত্রের প্রয়োজন হবে বা এটাকে উদ্ধৃত করতে হবে, তারপরে এটি ফাংশনের মধ্যে মূল ফাইলের সাথে প্রতিস্থাপন করুন।
পিলুমো

আমার ধারণা, #প্রতিস্থাপন ওয়াইল্ডকার্ড হিসাবে ব্যবহার করা যেতে পারে *? সুতরাং আপনি টাইপ করতে পারে copy filenames# save-#। আমি মনে করি উত্স এবং টার্গেটের জন্য আপনি ওয়াইল্ডকার্ডের চরিত্রটি একইরকম হতে চান।
WinEunuuchs2Unix

4

আমি এই ওয়ান লাইনারটি আমার মধ্যে লিখেছি ~/.bashrcfindআমি মনে করি ব্যবহার করে আরও ভাল উত্তর পোস্ট করা যেতে পারে। এমনকি আরও ভাল উত্তর সিতে লেখা যেতে পারে আশা করি এই প্রশ্নোত্তরটি আরও ভাল উত্তরের জন্য বল ঘূর্ণায়মান:

cps () {
    # cps "Copy Splat", copy group of files to backup, ie "cps Filename .bak"
    # Copies Filename1 to Filename1.bak, Filename2 to Filename2.bak, etc.
    # If Filename1.bak exists, don't copy it to Filename1.bak.bak
    for f in "$1"*; do [[ ! "$f" == *"$2" ]] && cp -a "$f" "$f$2"; done

    # OLD version comments suggested to remove 
    # ls "$1"* | while read varname; do cp -a "$varname" "$varname$2"; done
}
  • for f in "$1"*; do: $1হয় gmail-meta3পরামিতি এবং fম্যাচিং ফাইলের তালিকা রয়েছে। Gmail-meta3, gmail-meta3-LAB-9999 ইত্যাদির জন্য এই অর্থ সংযুক্ত করে নিম্নলিখিতগুলি করুন
  • [[ ! "$f" == *"$2" ]] &&: উপরের $fমত একই f$2হয় .bakপ্যারামিটার পাস। সংযুক্ত এর অর্থ যদি ফাইলের নামটি শেষ না হয় .bak(কারণ আমরা অনুলিপি করতে .bakও তৈরি করতে চাই না .bak.bak) তবে নিম্নলিখিতটি করুন
  • cp -a "$f" "$f$2"; gmail-meta3.bak ইত্যাদিতে gmail-meta3 অনুলিপি করুন
  • done: ফিরে লুপ করুন এবং gmail-meta3* তালিকার পরবর্তী ফাইলের নামটি ধরুন ।

cps gmail-meta3 .bak নমুনা আউটপুট

উদাহরণ হিসাবে এখানে প্রশ্নটি ব্যবহার করা হচ্ছে এটি কীভাবে কার্যকর হয়:

───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ ll gmail-meta3*
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3.bak
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821
-rw-rw-r-- 1 rick rick   728954 Jun 27 05:46 gmail-meta3-YAD-1558392194-26467821.bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ cps gmail-meta3 .bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ ll gmail-meta3*
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3
-rw-rw-r-- 1 rick rick 26467821 May 20 16:43 gmail-meta3.bak
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821
-rw-rw-r-- 1 rick rick      643 May 20 16:43 gmail-meta3-LAB-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821
-rw-rw-r-- 1 rick rick    49607 May 20 16:44 gmail-meta3-REC-1558392194-26467821.bak
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821
-rw-rw-r-- 1 rick rick   728954 Jun 27 17:04 gmail-meta3-YAD-1558392194-26467821.bak
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/gmail$ 

দ্রষ্টব্য: এটি টাইমস্ট্যাম্পগুলি সংরক্ষণ করার জন্য এবং আপনার ফাইল ব্যাকআপের আরও ভাল উপলব্ধি দিতে কমান্ড -aসহ পতাকাটি ব্যবহার করে cp

লক্ষ্য করুন যে ফাইল অনুলিপিগুলিতে মূলগুলির সাথে ঠিক একই তারিখ এবং সময় রয়েছে। যদি -aপ্যারামিটারটি বাদ দেওয়া হয় তবে তাদের বর্তমান তারিখ এবং সময় দেওয়া হবে এবং ফাইলের আকার একই হবে ব্যতীত সত্যিকারের ব্যাকআপের মতো লাগবে না।


6
লোকেরা সর্বদা ls
পার্সিংয়ের

3
আপনি যেহেতু উল্লেখ করেছেন findআমি ধরে নিলাম আপনি পার্সিংয়ের ঝুঁকি সম্পর্কে অবগত আছেন ls? কিন্তু আপনার ক্ষেত্রে তন্ন তন্ন প্রয়োজনীয়: শুধু কি for file in "$1"*; do copy -a "$file" "$file$2"; done- এই সম্পূর্ণরূপে নিরাপদ এবং মাধ্যমে পরোক্ষ যে কোন ধরণের চেয়ে অনেক সহজ lsবা findএকটি whileলুপ।
কনরাড রুডলফ

@ কনরাড রুডলফ আপনার পরামর্শের জন্য ধন্যবাদ। আমি আপনার পরামর্শটি কয়েকটা ছোট ছোট পরিবর্তন করে প্রয়োগ করেছি এবং পরীক্ষা করেছি।
WinEunuuchs2Unix

2

আপনার প্রয়োজনীয়তা অর্জনের আরেকটি পদ্ধতি হ'ল ফাইলগুলি একটি অস্থায়ী ডিরেক্টরিতে অনুলিপি করা এবং renameতাদের নাম পরিবর্তন করতে কমান্ডটি ব্যবহার করা ।

$ mkdir backup
$ cp filename* /tmp/rename-backup/
$ rename 's/(filename.*)/$1.bak/' /tmp/rename-backup/*
$ mv /tmp/rename-backup/* ./

আপনার যদি এটির স্ক্রিপ্ট হিসাবে প্রয়োজন হয় তবে আপনি এটির মতো এটি ব্যবহার করতে পারেন

cps () {
    mkdir -p /tmp/rename-backup/
    cp "$1"* /tmp/rename-backup/
    rename "s/($1.*)/\$1.$2/" /tmp/rename-backup/*
    mv "/tmp/rename-backup/$1"*".$2" .
}

এবং আপনি এটি এর মতো ব্যবহার করতে পারেন:

cps file bak

এটি একটি উদাহরণ

$ ls -l
total 0
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file a
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ab
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ac
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename1
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename2
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename3
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename4
$ cps file bak
$ ls -l
total 0
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file a
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file a.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ab
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file ab.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:23 file ac
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 file ac.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename1
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename1.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename2
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename2.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename3
-rw-r--r--  1 danny  wheel  0 Jun 26 16:41 filename3.bak
-rw-r--r--  1 danny  danny  0 Jun 26 16:05 filename4
-rw-r--r--  1 danny  danny  0 Jun 26 16:41 filename4.bak
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.