बैकअप के लिए फ़ाइलों (फाइलनाम) की प्रतिलिपि समूह (फ़ाइल नाम * .bak)


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
समस्या मुझे दो बार ग्लोब ऑपरेटर का उपयोग करते हुए दिखती है, जो आपके अन्य कमांड का उपयोग नहीं करता है। bash इसे संभालने के लिए पर्याप्त स्मार्ट नहीं है।
qwr

2
@qwr, तथ्य यह है कि बैश मेटाकाचर्स का विस्तार करता है और इनपुट को टोकन से पहले एक कमांड को निष्पादित करने के लिए इसे बंद करने से पहले टोकन करता है, UNIX गोले के डिजाइन का हिस्सा है। किसी तरह कोशिश करने और cp कमांड के लिए एक अपवाद प्रोग्राम करने से बैश की पूरी स्थिरता टूट जाएगी, जो बिल्कुल भी स्मार्ट नहीं होगा। एक अभ्यास के रूप में, कोशिश करें और पता करें कि यहां क्या हो रहा है, और यह शेल का मेटाचैकर विस्तार क्यों है जो इसे बनाता है:touch aa ab ba; mkdir bb; cp a* b*; ls *
माइक एस

@ मायके संकेत के लिए धन्यवाद। कल किसी और ने कहा कि आप *स्रोत फ़ाइल नाम के लिए वाइल्डकार्ड का उपयोग कर सकते हैं लेकिन लक्ष्य फ़ाइल नाम के लिए नहीं। जैसे कि विकल्प वाइल्डकार्ड (मुझे लगता है ##कि सुझाव दिया गया था लेकिन मैं इसकी ओर झुक रहा हूं %) को लक्ष्य के लिए उपयोग करना होगा। मुझे लगता है कि यह वही है जो आप मजबूत कर रहे हैं? मुझे cpकमांड बदलने की बिल्कुल भी उम्मीद नहीं थी । बस एक आवरण लिपि बनाएँ, जिसे copyएमोस (कारण के भीतर) DOS कॉपी कमांड कहा जाता है।
WinEunuuchs2Unix

@ WinEunuuchs2Unix वह व्यक्ति सही था। शेल मेटाचैकर कमांड से स्वतंत्र होते हैं। इसलिए सभी वाइल्डकार्ड पैटर्न से मेल खाने वाली सभी फ़ाइलों का मिलान करने का प्रयास करेंगे। यदि आप एक सामान्य-उद्देश्य बनाने की कोशिश कर रहे हैं "सब कुछ मिलान करें और उन्हें जो कुछ भी हो लेकिन इस प्रत्यय को जोड़ें" कार्यक्रम को कॉपी करें, तो हाँ, एक अनपेक्षित मेटाचैकर को डाल देना क्योंकि लक्ष्य शायद वह नहीं होगा जो आप चाहते हैं। क्योंकि शेल कमांड लाइन में सभी मेटाचैकर का विस्तार किया जाता है। यदि आप निश्चित रूप से जानते हैं कि लक्ष्य मेटाचैकर कभी मेल नहीं खाएगा, तो आप इसका उपयोग कर सकते हैं- क्योंकि शेल इसका विस्तार नहीं कर सकता है।
माइक एस

... लेकिन यह एक बदसूरत बात होगी। एक विशेष चरित्र का उपयोग करने के लिए बेहतर है। % या अंडरस्कोर अच्छा है, वे आम तौर पर मेटाचेचर्स नहीं हैं (लेकिन एक crontab फ़ाइल में% का उपयोग करने से सावधान रहें; यह विशेष है)।
माइक एस

जवाबों:


14

यहाँ sedइस कार्य के लिए लागू होने वाले एक प्रयोग का उदाहरण दिया गया है :

sed -i.bak '' file-prefix*

इस तरह, वास्तव में, sedफ़ाइलों को नहीं बदलेगा, क्योंकि हमने कोई आदेश नहीं दिया था '', लेकिन विकल्प के कारण -i[suffix]यह प्रत्येक फ़ाइल की एक बैकअप प्रतिलिपि बनाएगा। मुझे यह दृष्टिकोण तब मिला जब मैं खोज रहा था कि क्या किसी फ़ाइल की बैकअप प्रतिलिपि बनाने का कोई तरीका है, बिना उसका नाम टाइप किए दो बार?


FYI करें: $ time sed -i.bak '' gmail-meta3*=real 0m0.069s
WinEunuuchs2Unix

यदि फ़ाइलें पहले से मौजूद हैं तो real 0m0.037s:। यदि फ़ाइलें हटा दी जाती हैं और cpगति के करीब दूसरी बार चलती है real 0m0.051s:।
विनयुनुच्स 2 यूनिक्स

@ सुकोता एक दिलचस्प बिंदु। sedजब लक्ष्य फ़ाइलें पहले से मौजूद हों, तब तेज़ी से चालू होती है , लेकिन cpलक्ष्य फ़ाइलें मौजूद होने पर धीमी होती हैं। मैं वास्तव में syncबड़े समय परीक्षण करने के बजाय कैश और बफ़र्स फ्लश करता हूं लेकिन मैंने इस बार न तो किया। जैसा कि यह एक पूरी तरह से अलग-प्रश्न-विषय साबुन ओपेरा में पचा सकता है मुझे अपने परीक्षा परिणामों को साझा करने पर पछतावा है :( क्या इस बातचीत का दिखावा करने में बहुत देर हो गई है? FYI gmail संदेश मेटाडेटा आकार 2.5 एमबी है और 3 सूचकांक फाइलें लगभग 800 हैं? इसके अलावा, यह एक हार्ड डिस्क नहीं है, यह 4 चैनलों पर एक सैमसंग प्रो 960 NVMe SSD है।
WinEunuuchs2Unix

1
यह शायद मायने नहीं रखता कि आपके पास इन परीक्षणों के लिए कौन सा स्टोरेज डिवाइस है, अगर यह लिनक्स मशीन पर हो रहा है। मेमोरी में बफ़रिंग फ़ाइलों पर कर्नेल बेहद अच्छा है। freeकमांड का उपयोग करते समय यही "बफ़ / कैश" मान है । डिवाइस पर वास्तविक लिखना एक एल्गोरिथ्म द्वारा चुने गए क्षण में होता है जो मशीन पर कैश और मेमोरी दबाव की उम्र को ध्यान में रखता है। यदि आप कई परीक्षण आज़मा रहे हैं, तो पहली फ़ाइल रीड डिस्क से बाहर आ जाएगी, लेकिन बाद में पढ़ी जाने वाली मेमोरी सीधे मेमोरी से बाहर आ जाएगी (देखें sync; echo 3 > /proc/sys/vm/drop_caches)।
माइक एस

कल मैंने 2GB से अधिक बड़ी फ़ाइलों के साथ कुछ परीक्षण किए और - हाँ, यह दृष्टिकोण cpकमांड के उपयोग से अपेक्षाकृत धीमा है , लेकिन मैं यह नहीं कह सकता कि कोई महत्वपूर्ण प्रदर्शन अंतर है
पा ०४० 28०

13

आप उपयोग कर सकते हैं find:

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

वर्तमान निर्देशिका .में ग्लोब पैटर्न से मेल खाते नाम के साथ सभी फाइलें मिलेंगी (शेल ग्लोबिंग को रोकने के लिए पैटर्न के चारों ओर एकल उद्धरण)। मिली प्रत्येक फ़ाइल के लिए, यह cpनाम से name.bak तक निष्पादित होगा। द \ _; अंत में यह सुनिश्चित करता है कि यह एक बार में सभी को पारित करने के बजाय प्रत्येक फ़ाइल को व्यक्तिगत रूप से करेगा। 1 के रूप में अधिकतम गहराई केवल पीछे हटने के बजाय क्यूरेंट डायरेक्टरी को खोजती है।


1
क्या यह find . -max-depth 1 -name '"$1"'' -exec cp "{}" "{}$2" \;$ 1 के स्रोत और $ 2 के विस्तार के साथ काम करेगा ?
विनयुनुच्स 2 यूनिक्स

जब तक यह उचित है तब तक $ 2 को स्थानापन्न करना ठीक होना चाहिए। $ 1 मुश्किल हो सकता है क्योंकि हम एकल उद्धरणों के अंदर परिवर्तनीय प्रतिस्थापन नहीं कर सकते हैं। मुझे विश्वास नहीं हो रहा है लेकिन पैटर्न में एक स्ट्रिंग में संग्रहीत होने के बाद से दोहरे उद्धरणों में $ 1 का उपयोग करना संभव हो सकता है।
कोबरा

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

FYI करें: $ time for f in gmail-meta3* ; do cp -a "$f" "${f}.bak" ; done=real 0m0.046s
WinEunuuchs2Unix

उम नहीं मैं समय के लिए अनुकूलन नहीं करना चाहता। यह 0.046सेकंड है जिसका अर्थ है मानव धारणा के लिए 0 सेकंड। मैं केवल यह दिखाने की कोशिश कर रहा था कि कैसे मैं पोस्ट किए गए उत्तरों का परीक्षण कर रहा था और sedऊपर दिए गए कमांड को देखने वाले दर्शकों को दिलचस्प tidbits के साथ गुजर रहा था । या कम से कम मुझे तुलना sedकरने में दिलचस्पी थी cp....
WinEunuuchs2Unix

आपके समाधान के cpसाथ sedहालांकि समाधान के साथ तुलना में तेज है । तो यह उत्सव का एक कारण है :)
WinEunuuchs2Unix

(1)  -aएक गैर-मानक परीक्षण ऑपरेटर है। उपयोग क्यों नहीं -e? (2) "अस्थायी निर्देशिका बनाने में असमर्थ।" कुछ भ्रामक त्रुटि संदेश है। (३) सिर्फ उपयोग क्यों नहीं 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)
G-Man कहते हैं मोनिका '

(योगदान करें)… (५) अर्घ्यघ! मत कहो $@; कहते हैं "$@"। (5 ब)  उपयोग करने के लिए कोई ज़रूरत नहीं है {और } आप चर जिस तरह से आप कर रहे हैं संदर्भ (जब "${FOLDER}",  "${PATTERN}" और  "${file}"); बस करो "$FOLDER",  "$PATTERN" और  "$file"। (६) यह मानता है कि फाइलें वर्तमान निर्देशिका में हैं।  cps 's/$/.bak/' d/fooकॉपी करेंगे d/fooकरने के लिए foo.bak मौजूदा निर्देशिका में, नहीं d/foo.bak
जी-मैन कहते हैं, 'मोनिका'

6

DOS प्रतिमान के लिए आपको निकटतम संभावना 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 :)
विनयुनचूस 2 यूनिक्स

@ WinEunuuchs2Unix माफी - mcp / mmv एक मंथन था। असल में mcpसिर्फ के लिए एक पर्याय हैmmv -c
steeldriver

कोई चिंता नहीं है। अगर मेरे पास हर टाइपो के लिए एक डॉलर है, तो मैं एक करोड़पति बन जाऊंगा :) मैं printfकमांड पर स्पष्टीकरण चाहूंगा जो मैंने कभी इस्तेमाल नहीं किया है। क्या आप कह रहे हैं कि printf '%s\0' "$1"*अगर gmail-meta3पैरामीटर 1 के रूप में पारित किया गया तो क्या काम करेगा ?
WinEunuuchs2Unix

@ WinEunuuchs2Unix मैं शायद कॉलिंग संदर्भ को ग्लोबिंग करने दूंगा cps gmail-meta3*और फिर printf '%s\0"$ @" लिखूंगा । जबकि ... समारोह में `। या बस for f; do cp -- "$f" "$f.bak"; done( xiota के जवाब की तरह , लेकिन एक समारोह के रूप में) का उपयोग करें
इस्पात का तार

1
ध्यान दें कि zmvआप "वाइल्डकार्ड रिप्लेसमेंट" मोड का उपयोग कर सकते हैं, जो कि मुझे थोड़ा आसान लगता है:zmv -W -C 'gmail-meta3*' '*.bak'
0x5453

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


प्रत्यय जोड़ने के लिए स्क्रिप्ट के कुछ पुराने संस्करण:

@ WinEunuuchs2Unix उत्तर के समान, लेकिन मुझे लगता है कि अधिक लचीला और पार्सिंग नहीं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

फ़ंक्शन को पीठ में प्रत्यय के साथ जोड़ा गया।
pLumo

धन्यवाद जो अधिक सहज है। इसे एक प्रत्यय कहना सही है जिस तरह से मेरे जवाब ने इसे कोडित किया है लेकिन यह वास्तव में एक लक्ष्य या गंतव्य है। अन्य उपयोगकर्ता उपयोग करना चाह सकते हैं copy gmail-meta3* old-meta3*:। मेरे उत्तर में मैं यह पता नहीं लगा सका *कि मेरे प्रश्न का अनुरोध जैसा गंतव्य नाम कैसे मिलेगा ...
WinEunuuchs2Unix

समस्या यह है कि *शेल द्वारा व्याख्या की जाती है, इसलिए फ़ंक्शन को इसके बारे में नहीं पता होगा। आपको किसी अन्य चरित्र की आवश्यकता होगी या इसे उद्धृत करें, फिर इसे फ़ंक्शन के भीतर मूल फ़ाइल नाम से बदलें।
pLumo

मुझे लगता है कि के लिए #एक प्रतिस्थापन वाइल्डकार्ड के रूप में इस्तेमाल किया जा सकता है *? तो आप टाइप कर सकते हैं copy filenames# save-#। मुझे लगता है कि आप चाहते हैं कि वाइल्डकार्ड वर्ण स्रोत और लक्ष्य के लिए समान हो।
विनयुनुच्स 2 यूनिक्स 11

4

मैंने इस एक-लाइनर को अपने में लिखा ~/.bashrc। बहुत बेहतर जवाब का उपयोग findकर पोस्ट किया जा सकता है मुझे लगता है। सी में बेहतर उत्तर भी लिखे जा सकते हैं। उम्मीद है कि इस प्रश्नोत्तर में बेहतर उत्तरों के लिए गेंद लुढ़क जाती है:

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 को gmail-meta3.bak, आदि पर कॉपी करें।
  • 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पाश।
कोनराड रुडोल्फ

@KonradRudolph आपके सुझाव के लिए धन्यवाद। मैंने कुछ मामूली बदलावों के साथ आपके सुझाव को लागू किया और परीक्षण किया।
विनयुनुच्स 2 यूनिक्स

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.