ফাইলগুলি সন্ধান করুন এবং সেগুলি ট্যারি করুন (স্পেস সহ)


110

ঠিক আছে, এখানে খুব সহজ সমস্যা। আমি একটি সাধারণ ব্যাক আপ কোডে কাজ করছি। ফাইলগুলির মধ্যে ফাঁকা স্থান ব্যতীত এটি কাজ করে। এভাবেই আমি ফাইলগুলি সন্ধান করছি এবং সেগুলিকে একটি টার সংরক্ষণাগারে যুক্ত করছি:

find . -type f | xargs tar -czvf backup.tar.gz 

সমস্যাটি যখন ফাইলটির নামে একটি স্থান থাকে কারণ টার মনে করে যে এটি একটি ফোল্ডার। মূলত ফলাফলের আশেপাশে কোট যোগ করার কোনও উপায় আছে কি? নাকি এটিকে ঠিক করার আলাদা উপায়?


12
ব্যবহারের সবচেয়ে ভালো উপায় find ... | xargs ...-print0 / -0 প্রতিটি প্যারামিটার ব্যবহার করা: find -print0 ... | xargs -0 ...। এর ফলে ফাইলনামগুলি নাল অক্ষর দ্বারা পৃথক হবে, যার অর্থ আপনার ফাইলের নামগুলিতে আপনার ফাঁকা স্থান বা নিউলাইনগুলি বা অন্যান্য অদ্ভুত জিনিস থাকতে পারে এবং এটি এখনও কাজ করবে।
5:12

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

উত্তর:


217

এটা ব্যবহার কর:

find . -type f -print0 | tar -czvf backup.tar.gz --null -T -

এটি হবে:

  • স্পেস, নিউলাইনস, শীর্ষস্থানীয় ড্যাশগুলি এবং অন্যান্য মজাদারতার সাথে ফাইলগুলি ব্যবহার করুন
  • সীমাহীন সংখ্যক ফাইল পরিচালনা করুন
  • আপনার ব্যাকআপ.বার্টস বার বার ওভাররাইট করবেন না যখন আপনার tar -cসাথে xargsপ্রচুর পরিমাণে ফাইল থাকে তখন ব্যবহার করা হবে

আরও দেখুন:


1
আপনি যদি প্রথমে কয়েকবার সেডের মাধ্যমে নিজের অনুসন্ধানটি পাইপ করতে চান তবে আপনি কী করবেন? যেমন খুঁজে। -প্রিন্ট 0 | সেড / ব্যাকআপ / ডি | তার ....
ব্র্যাড পার্কস

8
মনে রাখবেন যে একাধিক শর্ত থাকলে আপনার প্রথম বন্ধনী যুক্ত করতে হবে। অন্যথায় -print0কেবল সর্বশেষ অভিব্যক্তিটির ক্ষেত্রে প্রযোজ্য। যেমনfind . \( -type f -o -name '*.c' \) -print0 | ...
নিমরোডম

1
মজা করার জন্য, এখানে সাইগউইন ব্যবহার করে এর একটি উইন্ডোজ সংস্করণ রয়েছে:c:\cygwin\bin\find . -regextype posix-egrep -regex '.*(sln^|vcxproj^|filters)$' -print0 | c:\cygwin\bin\tar -cvf MS_Projects.tar --null -T -
জন

1
@ স্টিভ আপনি দয়া করে টার্ম কমান্ডের শেষে '-' বিকল্পটি ব্যাখ্যা করতে পারেন। আমি এটি জিএনইউ টারের ম্যান পেজে খুঁজে পাচ্ছি না।
শাফুও

নিশ্চিত বিষয়, এটির জন্য একটি প্যারামিটার -T, এবং এর অর্থ স্ট্যান্ডার্ড ইনপুট থেকে ফাইলের নামগুলি পড়ুন: আপনি যদি `- ফাইলস-থেকে 'ফাইলের নাম হিসাবে একটি ড্যাশ দেন তবে (যেমন, আপনি --files-from = - বা -টি -), তারপরে ফাইলের নামগুলি স্ট্যান্ডার্ড ইনপুট থেকে পড়তে হবে
স্টিভ কেহলেট

14

আপনি যা চান তা অর্জনের আর একটি উপায় হতে পারে। মূলত,

  1. ব্যবহার করুন খোঁজ যাই হোক না কেন ফাইল আপনি যা খুঁজছেন আউটপুট পথে কমান্ড। আপনার পছন্দসই ফাইল নাম স্টাডাউট পুনর্নির্দেশ ।
  2. তারপরে -T বিকল্পের সাথে ট্যারি করুন যা এটি ফাইলের অবস্থানের একটি তালিকা নিতে অনুমতি দেয় (আপনি সন্ধানের সাথে সদ্য তৈরি করেছেন!)

    find . -name "*.whatever" > yourListOfFiles
    tar -cvf yourfile.tar -T yourListOfFiles
    

তাদের মধ্যে নতুন
লাইনের

8

চালানোর চেষ্টা করুন:

    find . -type f | xargs -d "\n" tar -czvf backup.tar.gz 

7

কেন না:

tar czvf backup.tar.gz *

নিশ্চিত যে এটি সন্ধান এবং তারপরে xargs ব্যবহার করা চালাক তবে আপনি এটি কঠোর উপায়ে করছেন।

আপডেট: পোরজেস একটি অনুসন্ধান-বিকল্পের সাথে মন্তব্য করেছে যা আমি মনে করি আমার উত্তর, বা অন্যটির চেয়ে ভাল উত্তর: find -print0 ... | xargs -0 ....


আমার পূর্ণ কোডটি কেবলমাত্র সেই আইটেমগুলিকে ব্যাক আপ করবে যা গত দিনে পরিবর্তিত হয়েছিল। এটির দৈনিক ব্যাক আপ থাকায় ফাইলের আকারে সংরক্ষণের জন্য আমি বারবার তথ্য রাখতে চাই না (প্রতি 15 দিনের মধ্যে আমারও পুরো ব্যাক আপ আছে)।
কালেব কেষ্টার

এটি আরও উন্নততর SO প্রশ্ন করতে, আমি "ফাইন্ড, এক্সার্গস এবং টার একসাথে ব্যবহার করে" নির্ভরযোগ্যতা সম্পর্কে প্রশ্নটি জিজ্ঞাসা করব। আপনার শিরোনাম এবং প্রশ্নটি সত্যই নির্দিষ্ট করে না যে আপনার সন্ধান এবং xargs প্রয়োজন, এবং এখনও আপনি করছেন।
ওয়ারেন পি

xargs ... tar c ...ফাইলগুলির তালিকা খুব দীর্ঘ এবং দ্বিতীয়বারের জন্য xargsকার্যকর করা হলে তৈরি করা প্রথম সংরক্ষণাগারটি ওভাররাইট করবে tar! ওভাররাইটিং এড়াতে আপনি ব্যবহার করতে পারেন xargs -xতবে সংরক্ষণাগারটি অসম্পূর্ণ হতে পারে। বিকল্প প্রথম হতে পারে tar c ...এবং তারপরে সম্ভবত বারবার হতে পারে tar r ...। (নির্ভরযোগ্যতার ক্ষেত্রে আমার অবদান :)
pabouk

3

আপনার যদি একাধিক ফাইল বা ডিরেক্টরি থাকে এবং আপনি সেগুলি স্বাধীন *.gzফাইলে জিপ করতে চান তবে আপনি এটি করতে পারেন। ঐচ্ছিক-type f -atime

find -name "httpd-log*.txt" -type f -mtime +1 -exec tar -vzcf {}.gz {} \;

এটি সংকোচিত হবে

httpd-log01.txt
httpd-log02.txt

প্রতি

httpd-log01.txt.gz
httpd-log02.txt.gz



2

@ স্টিভ কেহলেট পোস্টে একটি মন্তব্য যুক্ত করবে তবে 50 টি রেপ (আরআইপি) লাগবে।

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

find . -name "*.pdf" -type f -mtime 0 -printf "%f\0" | tar -czvf /dir/zip.tar.gz --null -T -
  1. . আপেক্ষিক ডিরেক্টরি

  2. -name "*.pdf" পিডিএফ (বা কোনও ফাইলের ধরণ) সন্ধান করুন

  3. -type f দেখার জন্য টাইপ করুন একটি ফাইল

  4. -mtime 0 গত 24 ঘন্টার মধ্যে তৈরি ফাইলগুলি সন্ধান করুন

  5. -printf "%f\0"নিয়মিত -print0বা -printf "%f"আমার জন্য কাজ করে নি। ম্যান পেজ থেকে:

এই উদ্ধৃতিটি GNU ls এর মতোই সঞ্চালিত হয়। এটি -l এবং -fls এর জন্য ব্যবহৃত একটি হিসাবে উদ্ধৃতি ব্যবস্থা নয়। আপনি যদি অনুসন্ধানের আউটপুটটির জন্য কোন ফর্ম্যাটটি ব্যবহার করবেন তা স্থির করতে সক্ষম হন তবে সাধারণত নতুন লাইনের ব্যবহারের চেয়ে টার্মিনেটর হিসাবে 'use 0' ব্যবহার করা ভাল, কারণ ফাইলের নামগুলিতে সাদা স্থান এবং নিউলাইন অক্ষর থাকতে পারে।

  1. -czvf সংরক্ষণাগার তৈরি করুন, জিজিপের মাধ্যমে সংরক্ষণাগারটি ফিল্টার করুন, প্রক্রিয়াজাতভাবে ভার্জুয়ালি ফাইল তালিকাবদ্ধ করুন, সংরক্ষণাগার নাম

2019-08-14 সম্পাদনা করুন: আমি যুক্ত করতে চাই যে আমি আমার মন্তব্যে একই কমান্ডটি মূলত কেবল টার ব্যবহার করে ব্যবহার করতে সক্ষম হয়েছি:

tar -czvf /archiveDir/test.tar.gz --newer-mtime=0 --ignore-failed-read *.pdf

প্রয়োজনে --ignore-failed-readআজকের জন্য কোনও নতুন পিডিএফ ছিল না।


1

সবচেয়ে ভাল সমাধানটি মনে হয় কোনও ফাইল তালিকা তৈরি করা এবং তারপরে ফাইলগুলি সংরক্ষণাগারভুক্ত করা উচিত কারণ আপনি অন্যান্য উত্সগুলি ব্যবহার করতে পারেন এবং তালিকার সাথে অন্য কিছু করতে পারেন।

উদাহরণস্বরূপ এটি সংরক্ষণাগারভুক্ত হওয়া ফাইলগুলির আকার গণনা করতে তালিকাটি ব্যবহার করে মঞ্জুরি দেয়:

#!/bin/sh

backupFileName="backup-big-$(date +"%Y%m%d-%H%M")"
backupRoot="/var/www"
backupOutPath=""

archivePath=$backupOutPath$backupFileName.tar.gz
listOfFilesPath=$backupOutPath$backupFileName.filelist

#
# Make a list of files/directories to archive
#
echo "" > $listOfFilesPath
echo "${backupRoot}/uploads" >> $listOfFilesPath
echo "${backupRoot}/extra/user/data" >> $listOfFilesPath
find "${backupRoot}/drupal_root/sites/" -name "files" -type d >> $listOfFilesPath

#
# Size calculation
#
sizeForProgress=`
cat $listOfFilesPath | while read nextFile;do
    if [ ! -z "$nextFile" ]; then
        du -sb "$nextFile"
    fi
done | awk '{size+=$1} END {print size}'
`

#
# Archive with progress
#
## simple with dump of all files currently archived
#tar -czvf $archivePath -T $listOfFilesPath
## progress bar
sizeForShow=$(($sizeForProgress/1024/1024))
echo -e "\nRunning backup [source files are $sizeForShow MiB]\n"
tar -cPp -T $listOfFilesPath | pv -s $sizeForProgress | gzip > $archivePath

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