নির্দিষ্ট এক্সটেনশন সহ সমস্ত ফাইল gzip করুন


11

আমি উবুন্টুতে সমস্ত ফাইল জিজিপ করার চেষ্টা করছি যা ফাইল এক্সটেনশন .css, .html বা .js আছে। শীর্ষস্থানীয় ডিরেক্টরি এবং সমস্ত উপ ডিরেক্টরিতে। আমি ইতিমধ্যে বিদ্যমান থাকলে মূল ফাইলগুলি এবং .gz ফাইলটি ওভাররাইট করতে চাই।

সুতরাং যখন আমার কাছে এন ফাইল রয়েছে, আমি এই এন ফাইলগুলি রাখতে এবং অতিরিক্ত এন সংরক্ষণাগার ফাইল তৈরি করতে চাই। শুধু একটি নয়।

আমার চেষ্টা ছিল এমন স্ক্রিপ্ট চালানো যা এরকম দেখাচ্ছে:

gzip -rkf *.css
gzip -rkf *.html
... one line for each file extension

প্রথম: আমি জিপিপ করতে চাইছি এমন প্রতিটি ফাইলের এক্সটেনশনের জন্য সেই স্ক্রিপ্টটিতে আমার একটি লাইন থাকা দরকার। এটি ঠিক আছে তবে আমি আরও একটি ভাল উপায় খুঁজে প্রত্যাশা করি

দ্বিতীয় এবং আরও গুরুত্বপূর্ণ: এটি কাজ করে না। যদিও -r কাজটি করা উচিত, সাব-ডিরেক্টরিগুলি অপরিবর্তিত। Gzip ফাইলটি কেবল শীর্ষ ডিরেক্টরিতে তৈরি করা হয়।

আমি এখানে কি মিস করছি?

বিটিডব্লিউ: নীচে ভার্বোজ আউটপুটটিতে একটি বাগ রয়েছে, তাই না? -K এবং -v বিকল্পটি ব্যবহার করার সময়

-k, --keep        keep (don't delete) input files
-v, --verbose     verbose mode

ভার্বোজ আউটপুট বলে যে এটি ফাইলটি প্রতিস্থাপন করে, যদিও "প্রতিস্থাপন" এর অর্থ মূল প্রতিস্থাপনের পরে মূল ফাইলটির অস্তিত্ব নেই। যাইহোক, এটি কেবল আউটপুট জিনিস।

$ ls
  index.html      subdir1  testfile      testfile.css.gz
  javaclass.java  subdir2  testfile.css
$ gzip -fkv *.css
  testfile.css:   6.6% -- replaced with testfile.css.gz
$ ls
  index.html      subdir1  testfile      testfile.css.gz
  javaclass.java  subdir2  testfile.css

1
-rডিজাইন হিসাবে কাজ করে। ম্যান জিজিপ থেকে : ডিরেক্টরি কাঠামোটি পুনরাবৃত্তভাবে ভ্রমণ করুন। কমান্ড লাইনে নির্দিষ্ট করা ফাইলের যে কোনও ডিরেক্টরি যদি ডিরেক্টরি হয় তবে gzip ডিরেক্টরিতে নেমে সেখানে উপস্থিত সমস্ত ফাইল সংকুচিত করবে (বা বন্দুকের ক্ষেত্রে সেগুলি সঙ্কুচিত করবে)। (জোর আমার)
ডেনিস

ঠিক আছে. সুতরাং -r XYZ.css নাম সহ একটি ডিরেক্টরি প্রবেশ করবে। তারপরে পুনরাবৃত্তিটি আমার প্রত্যাশার মতো ডিজাইন করা হয়নি।
সাদিক

উত্তর:


7

প্রতিটি ফাইল সন্ধান করার জন্য লুপের সাহায্যে এটি করতে পারেন তারপরে এটি সংকুচিত করুন:

for i in `find | grep -E "\.css$|\.html$"`; do gzip "$i" ; done

ধন্যবাদ! যদিও -rবিকল্পটি কাজ করে না, -kএবং -fকাজ করছে, তাই আমি তাদের এগুলি ব্যবহার করতে পারি: আমি ভিতরে find | grep -E "\.css$|\.html$"; do gzip -vkf "$ i"; সম্পন্ন
সাদিক

@ সাদিক: সাবধান! কোনও ফাইলের নামের মধ্যে একটি স্থান থাকলে এই পদ্ধতির কাজ হবে না।
ডেনিস

আপনি ব্যাখ্যা করতে পারবেন না কেন?
সাদিক

1
@ সাদিক: `...`একটি স্ট্রিং সরবরাহ করে, তালিকা নয়। সেই স্ট্রিংটি কোথায় বিভক্ত হওয়া উচিত তা সিদ্ধান্ত নিতে forঅভ্যন্তরীণ ক্ষেত্র বিভাজক ( $IFS) ব্যবহার করে । ডিফল্টরূপে, এটি লাইনফিড, ট্যাব এবং স্পেসে বিভক্ত হয়, সুতরাং আপনার কাছে যদি কোনও ফাইল বলা হয় new style.css, আদেশগুলি gzip newএবং gzip style.cssকার্যকর করা হবে।
ডেনিস

1
@ সাদিক, ডেনিস ঠিক আছে, দ্রুত কাজের মতো আপনি লুপের export IFS=$'\n'ঠিক আগে চলে যেতে পারেন for
mndo

14

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

find /path/to/dir \( -name '*.css' -o -name '*.html' \) -exec gzip --verbose --keep {} \;

nameআপনি inameযদি এক্সটেনশানগুলিকে কেস-সংবেদনশীলভাবে (যেমন অন্তর্ভুক্ত .CSSএবং / অথবা .HTMLএক্সটেনশনগুলি) মেলাতে চান তবে পরিবর্তন করুন । আপনি /path/to/dirযদি বর্তমান ডিরেক্টরি থেকে পুনরাবৃত্ত অনুসন্ধান শুরু করতে চান তবে আপনি বাদ দিতে পারেন।


2
যারা --keepস্যুইচটি সম্পর্কে ভাবতে পারেন, হ্যাঁ, এটি আসল ফাইলগুলি ধরে রাখতে পারে। আপনি যদি একবার তাদের জিপিড করে মুছতে চান তবে তা ছাড়ুন।
বেন জনসন

4

ফাইলগুলির তালিকা পেতে:

find -type f | grep -P '\.js|\.html|\.css'

এবং এই সমস্ত ফাইল gzip করতে:

find -type f | grep -P '\.js|\.html|\.css' | tar cvzf archive.gz -T -

এই না একটি তালিকা আউটপুট ফাইল দ্বারা , বরং ফাইল নিজেদের চেয়ে? tarfind
জোস

আমি আমার প্রশ্নটি সম্পাদনা করে পরিষ্কার করেছিলাম যে আমি প্রতিটি সিএসএস, এইচটিএমএল বা জেএস ফাইলের জন্য একটি সংরক্ষণাগার ফাইল রাখতে চাই।
সদিক

2
@ যোস নো -Tঅপশনটি tarফাইল নাম হিসাবে ইনপুটটি প্রসেস করে।
বিশৃঙ্খলার

@ চাওস আহ, আপনাকে ধন্যবাদ আমি আজ কিছু শিখেছি।
জোস

2

আমি স্টিল্ড্রাইভারের উত্তরটি ব্যবহার করেছি , তবে আমি এটি --bestএবং --forceবিকল্পগুলি দিয়ে এটি সম্পূর্ণ করতে চাই ।

cdযে কোনও ফোল্ডারে এই কোডটি টাইপ করুন। আপনার সমস্ত মিলে যাওয়া ফাইলগুলি জিজেপ করা হবে।

find . \( -name '*.css' -o -name '*.js' \) -exec gzip --verbose --keep --best --force {} \;
  • --bestসেরা সংক্ষেপণের অনুপাতের জন্য ব্যবহার করুন ।
  • --forceইতিমধ্যে কোনও জিজেড ফাইল আছে কিনা তা জিজ্ঞাসা না করে ওভাররাইটিংয়ের জন্য ব্যবহার করুন।

1

আপনি গ্লোবস্টার ব্যবহার করতে পারেন।

সঙ্গে globstarশেল বিকল্প সক্রিয় করা হলে, আপনার প্রয়োজন হয় gzip -vk **/*.{css,html}

বাশ শেলের একটি globstarবিকল্প রয়েছে যা আপনাকে পুনরাবৃত্ত গ্লোবগুলি দিয়ে লিখতে দেয় **shopt -s globstarএটি সক্ষম করে তবে আপনি যে কমান্ডগুলি পরে চালাবেন সেটির জন্য আপনি এটি নাও করতে চাইতে পারেন, সুতরাং আপনি এটির পরিবর্তে এটি এবং আপনার gzip কমান্ডটি সাব-শেইলে চালাতে পারেন ।

এই কমান্ডের gzipসব গুলি .cssএবং .htmlকোন তার সাবডিরেক্টরি বর্তমান ডিরেক্টরির মধ্যে ফাইল, কোনো তাদের সাবডিরেক্টরি, ইত্যাদি, মূল ফাইল (পালন -k) এবং আপনি এটি (কি করছে কহন -v):

(shopt -s globstar; gzip -vk **/*.{css,html})

যদি আপনি ফাইল-নামগুলি কেস-সংবেদনশীলতার সাথে মেলতে চান তবে কিছু বা সমস্ত অক্ষরের সাথে বড় আকারের সেই এক্সটেনশনগুলি অন্তর্ভুক্ত করা হয়, তবে আপনি nocaseglobশেল বিকল্পটি সক্ষম করতে পারেন :

(shopt -s globstar nocaseglob; gzip -vk **/*.{css,html})

;দুটি কমান্ড পৃথক করে, এবং বহিরাগত ( )তাদের একটি সাব-শেলের মধ্যে চালিত করে। একটি সাব-শেলের মধ্যে একটি শেল বিকল্প সেট করার কারণে এটি কলিং শেলটিতে সেট হয়ে যায় না। আপনি যদি সক্ষম করতে চান globstarতবে আপনি চালাতে পারবেন shopt -s globstar; তাহলে আপনি কেবল কমান্ডটি চালাতে পারেন:

gzip -vk **/*.{css,html}

আপনি নিষ্ক্রিয় করতে পারেন globstarসঙ্গে shopt -u globstar। এটি বর্তমানে সক্রিয় করা আছে কিনা তা আপনি পরীক্ষা করতে পারেন shopt globstar

কিভাবে এটা কাজ করে

এই gzipকমান্ডটি কীভাবে কাজ করে তার মূল কীটি হ'ল ডিরেক্টরি হায়ারার্কির প্রতিটি ফাইলের একটি তালিকা মিলে যাওয়া নামের সাথে তৈরি করার জন্য শেলটি এর উপর বিস্তৃততা সম্পাদন করে, তারপরে এই ফাইলটির প্রত্যেকটির নাম আর্গুমেন্ট হিসাবে পাস করে gzip

  • ব্রেস সম্প্রসারণ পরিণত **/*.{css,html}হয় **/*.css **/*.html
  • তারপরে গ্লোব্বিং সেই দুটি নিদর্শনগুলি বর্তমান ডিরেক্টরিতে ( **, কারণে globstar) এর অ্যাক্সেসযোগ্য ফাইলগুলির নামগুলিতে প্রসারিত করে যার ফাইলনামগুলিতে* নির্দিষ্ট (প্রত্যেকে ) .cssবা ( .htmlএই ক্ষেত্রে) এর পরে কিছু ( ) অন্তর্ভুক্ত রয়েছে।

এটি যাদের নামের সাথে শুরু হয়. বা ডিরেক্টরিতে এই নামে নাম লেখানো ফাইলগুলির সাথে এটি মেলে না । আপনার কাছে সম্ভবত এই জাতীয় কোনও এইচটিএমএল এবং সিএসএস ফাইল নেই এবং যদি আপনি এটি করেন তবে আপনি সম্ভবত সেগুলি অন্তর্ভুক্ত করতে চান না। তবে আপনি যদি সেগুলি অন্তর্ভুক্ত করতে চান না, তবে আপনি আপনার প্রয়োজনের উপর নির্ভর করে তাদের সাথে সুস্পষ্টভাবে মেলে নিতে পারেন। উদাহরণস্বরূপ, পরিবর্তন **/*.{css,html}করার জন্য **/{,.}*.{css,html}যে ফাইল দিয়ে শুরু অন্তর্ভুক্ত .এখনও না ফোল্ডার যে অনুসন্ধানের।

আপনি যদি দুটি ফাইলই চান যার নাম দিয়ে শুরু হয় .এবং যে ডিরেক্টরিগুলির নামগুলি .অন্তর্ভুক্ত করা উচিত সেগুলিতে ফাইলগুলি , একটি ক্লিনার এবং সহজ উপায় আছে: dotglobশেল বিকল্পটি সক্ষম করুন ।

(shopt -s globstar dotglob; gzip -vk **/*.{css,html})

অথবা আপনি যদি ফাইল -এর সাথে কেস-সংবেদনশীল ম্যাচিং এবং মিল শুরু করতে চান তবে .:

(shopt -s globstar nocaseglob dotglob; gzip -vk **/*.{css,html})

**খুব দীর্ঘ কিছুতে প্রসারিত করার জন্য এটি খুব বিরল হলেও সম্ভব ।

আপনার যদি এই নামে নামের প্রচুর ফাইল থাকে তবে এটি ত্রুটি বার্তায় ব্যর্থ হতে পারে যা ব্যাখ্যা করে যে শেলটি কমান্ড লাইনটি তৈরি করতে পারে না কারণ এটি খুব দীর্ঘ হবে। (হাজার হাজার ফাইল সহ, এটি সাধারণত কোনও সমস্যা হয় না))

gzip একেবারেই ডাকা হবে না, সুতরাং আপনি অর্ধেক কাজ পাবেন না।

এই ত্রুটি যদি সেটা হয়, অথবা যদি আপনি এটি সম্পর্কে চিন্তিত হয়ে গেলে, আপনি ব্যবহার করতে পারেন findসঙ্গে -exec, হয় যেমন steeldriver বর্ণনা (সঙ্গে {} \;) অথবা হিসাবে আমি (সঙ্গে নীচে বর্ণনা {} +)।

আপনি ব্যবহার করতে পারেন findসঙ্গে -execঅ্যাকশন ও +দক্ষতা জন্য।

gzipকমান্ড সমর্থন দেয়া হচ্ছে একাধিক ফাইল নাম সংকুচিত করা হবে। তবে এই findকমান্ডটি যদিও এটি ভালভাবে কাজ করে এবং আপনার অনেক ফাইল না থাকলে ধীর হবে না , প্রতিটি ফাইলের gzipজন্য একবার কমান্ডটি চালায় :

find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} \;

এটি কাজ করে এবং আপনি অবশ্যই এটি ব্যবহার করতে পারেন। ( .বর্তমান ডিরেক্টরি থেকে অনুসন্ধান করে that এছাড়াও, স্টিল্ড্রাইভারের খুব ভাল উত্তরে কমান্ডটি লেখার এটি কিছুটা ভিন্ন উপায় ; আপনি যে কোনও স্টাইলই পছন্দ করেন ব্যবহার করতে পারেন))

আপনি findএকাধিক ফাইলের নাম পাসও করতে gzipএবং এটি প্রয়োজনীয় হিসাবে কেবল বহুবার চালাতে পারেন - যা প্রায় সবসময় কেবল একবার। এটি করতে, পরিবর্তে ব্যবহার +করুন\;+যুক্তি পরেই আসা উচিত {}। অতিরিক্ত ফাইল নামগুলির সাথে findপ্রতিস্থাপন +করে, যদি কোনও হয়।

find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +

+কেবলমাত্র কয়েকটি সংখ্যক ফাইলের ফাইল থাকলেও এটি ব্যবহার করা ঠিক আছে এবং এর মধ্যে অনেকগুলি উপস্থিত থাকলে gzipপ্রতিটি ফাইলের জন্য পৃথক প্রার্থনা করার চেয়ে এটি লক্ষণীয়ভাবে দ্রুত হতে পারে ।

স্টিল্ড্রাইভার যেমন উল্লেখ করেছেন , আপনি ফাইলটির সাথে মিল রেখে তার নামের -inameপরিবর্তে বা বিভিন্ন মূলধনের সাথে ব্যবহার করতে পারেন । সক্রিয় এই অনুরূপ মধ্যে ভিত্তিক পদ্ধতি উপরে বর্ণিত।-name.css.htmlnocaseglobglobstar

শেষ অবধি, আপনার কাছে সম্ভবত কোনও মেলানো ফাইল বা ডিরেক্টরি নেই যা শুরু হয় .। তবে আপনি যদি করেন তবে findস্বয়ংক্রিয়ভাবে সেগুলি অন্তর্ভুক্ত করে। যদি আপনি এগুলি বাদ দিতে চান ( বন্ধ globstarথাকাকালীন উপরে উল্লিখিত ভিত্তিক পদ্ধতিটি যেমন ঘটে থাকে dotglob), আপনি করতে পারেন :

find . -not -path '*/.*' \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +

globstarভিত্তিক পথ উপরে বর্ণিত লিখতে সহজ হয়, বিশেষ করে যদি আপনি ব্যতীত ডিরেক্টরি এবং ফাইল দিয়ে শুরু করছি ., যেহেতু ডিফল্ট আছে।

কি না করতে ...

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

findঅন্য কমান্ডের আউটপুটটি নিরাপদে পাইপ করা সম্ভব যা আপনি যদি-print0 এটি ব্যবহার করেন বা অনুরূপ কোনও ক্রিয়াকলাপ এটির জন্য একটি নিউলাইন পরিবর্তে পাথের মধ্যে নাল অক্ষর রাখার কারণ হয়ে থাকে , অন্যথায় নয়। ফাইলের নামগুলিতে নিউলাইনগুলি থাকতে পারে (যদিও আমি তাদের সাথে ইচ্ছাকৃতভাবে ফাইলের নামকরণ করা থেকে নিরুৎসাহিত করি)। ক্রিয়া সহ একটি findকমান্ড -print- কোনও স্পষ্ট ক্রিয়া ছাড়াই কমান্ড সন্ধান সহ, তখন থেকে -printপূর্বনির্ধারিত - আউটপুট উত্পাদন করে না যা নিরাপদে পাইপ করা যায় বা অন্যথায় ফাইলগুলিতে ক্রিয়া সম্পাদন করে এমন অন্য কমান্ডকে সরবরাহ করা হয়।

কর্মটি findসহ উত্পাদিত আউটপুটটি -print0নিরাপদে পাইপ করা যেতে পারে xargs -0( -0পতাকা xargsনাল-পৃথক ইনপুট আশা করতে বলে )।


0

ফোল্ডার / সাবফোল্ডারে সমস্ত ফাইল পুনরুক্তভাবে জিপ করতে:

gzip -r `find . -type f -name "*.html"` 

আনজিপ করতে:

gunzip -r `find . -type f -name "*.gz"` 

এই কমান্ড প্রতিস্থাপন ভিত্তিক পদ্ধতিটি প্রায়শই ভাঙবে এবং বেশ খারাপভাবে। সমস্যাটি হ'ল স্পেস বা অন্যান্য শ্বেতস্পেস যুক্ত ফাইলের নামগুলি বিভক্ত করা হবে এবং একাধিক ফাইলের নাম হিসাবে বিবেচনা করা হবে। (এই আদেশগুলি ` `সিনট্যাক্স ব্যবহার করে লেখা হয়েছে , তবে সিনট্যাক্সটি ব্যবহার করার সময়ও সমস্যাটি পুরোপুরি প্রযোজ্য $( )))
এলিয়াহ কাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.