আমি আনজিপ / জিপকে কীভাবে বাধ্য করতে পারি যখন আমি এটি নিষ্কাশন করার সময় একটি উপ-ডিরেক্টরি তৈরি করতে না পারি?


19

একটি জিপ ফাইল কীভাবে তৈরি করা হয় তার উপর নির্ভর করে, কখনও কখনও এটি সমস্ত ফাইল সরাসরি বের করে আনবে, এবং কখনও কখনও এটি ফাইলগুলিকে একটি উপ ডিরেক্টরিতে সরিয়ে ফেলবে।

যদি পরবর্তীটি সত্য হয় তবে আমি কীভাবে unzipআদেশটিকে প্রথম স্তরের ডিরেক্টরিটিকে "উপেক্ষা" করতে বাধ্য করব ?

উদাহরণ:

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll

আমি যা পাচ্ছি তা হ'ল /tmp/omeka/omeka-1.5.1/:

total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/

আমি যা চাই তা সরানো ফাইলগুলির মধ্যে /tmp/omeka/একটি, (এক স্তর উপরে এবং ডিরেক্টরি কাঠামোর মধ্যে কোনও সংস্করণ নম্বর অন্তর্ভুক্ত নয়)

/tmp/omeka/(files)

আমি জানি আমি -j"জাঙ্ক পাথ" এর বিকল্পটি ব্যবহার করতে পারি তবে আমি কেবল শীর্ষ স্তরের ডিরেক্টরি কাঠামো নয়, সাব-ডিরেক্টরি ডিরেক্টরি রাখতে চাই। কিভাবে আমি এটি করতে পারব?


PS: আমি জানি যে আমি mvফাইলগুলি বের করতে এবং তারপরে ফাইলগুলি বের করতে পারি , তবে আমি দেখতে চেয়েছিলাম যে আনজিপ কমান্ড থেকে সরাসরি এটি করার কোনও উপায় আছে কিনা
সিডব্লু

আমি একটি সম্পর্কে অবগত নই। তবে যদি ফাইলের নামটি সর্বদা ডিরেক্টরি (এক্সটেনশন বাদে) ডিরেক্টরিটির সাথে মেলে তবে এটি এক্সট্রাক্টড দিরের নামটি স্ক্রিপ্ট করা বেশ সোজা।
মাদুর

3
আপনি যা করতে চাইছেন তা আমি দেখতে পাচ্ছি, তবে আমি এটির প্রস্তাব দেব না। আপনার প্রকল্প উত্স থেকে সংস্করণ নম্বর কেটে ফেলা একটি খারাপ ধারণা; আপনার যদি কেবল সংস্করণ তথ্য ছাড়াই সংক্ষিপ্ত নাম চান তবে আপনার কেবলমাত্র সাধারণভাবে নিষ্কাশন করা উচিত এবং একটি ln -s ব্যবহার করা উচিত। আপনি যে সংস্করণটি চালাচ্ছেন তা আপনি সর্বদা জানেন এবং লিঙ্কটি স্যুইচ করে সহজেই নতুন সংস্করণে আপডেট করতে পারেন।
বার্টন সামোগ্রাড

@ বার্টনস্যামোগ্রাড - এটি আদর্শ হবে তবে আমি এখনও আগ্রহী যদি এটি করার কার্যকর উপায় থাকে তবে কিছু সফ্টওয়্যার উদাহরণস্বরূপ ওয়ার্ডপ্রেসকে /wordpress/জিপ ফাইলের ভিতরে প্রতিটি সংস্করণ ডিরেক্টরিতে (কোনও সংস্করণ নম্বর নেই) রাখে । এটি আসলে unzipএবং তখনই ঠিক আছে তবে এটির mvকোনও নিয়ন্ত্রণ না থাকা এবং এটি দুটি ধাপে করার জন্য আমার স্নায়ুগুলিতে সর্বদা কিছুটা সামান্য পাওয়া গেছে। ভাগ্যক্রমে ওয়ার্ডপ্রেসটিও একটি .tar.gzস্বাদে আসে :)
সিডউইড

চেষ্টা করুনcd /tmp/omeka && ln -s -T . omeka-1.5.1
জেমস ইয়ংম্যান

উত্তর:


4

FUSE ফাইল সিস্টেম ব্যবহার করুন যা আপনাকে ডিরেক্টরি যেমন আভিএফএসের মতো সংরক্ষণাগারগুলি ব্রাউজ করতে দেয় । cpআপনার পছন্দের ডিরেক্টরিতে ফাইলগুলি নিষ্কাশন করতে ব্যবহার করুন ।

mountavfs
cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/omeka-1.5.1 omeka

যেহেতু আমরা ধরে নিচ্ছি যে সংরক্ষণাগারে একটি একক শীর্ষ স্তরের ডিরেক্টরি রয়েছে, আপনি এটি সংক্ষিপ্ত করতে পারেন

cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/* omeka

@ গিলস আপনি বিশেষজ্ঞ যারা এসেছেন এবং সমস্ত প্রশ্নের উত্তর অন্য কেউ উত্তর দিতে পারে না, তাই আমি অনুমান করি এটি করার একমাত্র উপায় এটি। আমি আশা করছিলাম unzipযে এটি করার মতো কিছু ম্যাজিক আছে যেমন ফাইলগুলি যেমন নিষ্কাশনের জন্য নির্দিষ্ট করা */*, আমি অন্য কোনও ইউটিলিটি ইনস্টল না করে ব্যবহার করতে পারি তবে আমার ধারণা নেই। ধন্যবাদ। +1
cwd

6

যদি আপনার জিপ ফাইলটিতে কোনও ডিরেক্টরি কাঠামো না থাকে বা আপনার এটি সংরক্ষণ করার প্রয়োজন না হয় তবে আপনি এটি ব্যবহার করতে পারেন:

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
unzip -j omeka-1.5.1.zip -d omeka
cd omeka
ll

3

এই স্ক্রিপ্টটি শক্তিশালী নয়, তবে সাধারণ ক্ষেত্রে কাজ করে:

...
dest=omeka
unzip omeka-1.5.1.zip -d $dest/

if [ `ls $dest | wc -l` == 1 ]; then
  subdir=`ls $dest`
  mv $dest/$subdir/* $dest/
  rmdir $dest/$subdir
fi

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


2

আমি আজই নিবন্ধভুক্ত করেছি, সুতরাং আমি @ স্টেভেননেট উত্তরটিকে উচ্চারণ করতে পারি না এবং সেখানে কোনও মন্তব্য যুক্ত করতে পারি না।

তার উত্তরের ভিত্তিতে আমি এরকম একটি পুনরাবৃত্ত ফাংশন তৈরি করেছি:

...

shopt -s dotglob # To include hidden files in the move command

function moveSub {
  local dest=$1
  if [ `ls $dest | wc -l` == 1 ]; then
    local subdir=`ls $dest`
    moveSub "$dest/$subdir"
    mv $dest/$subdir/* $dest/
    rmdir $dest/$subdir
  fi
}

moveSub "$dest"

ঠিক যেমন @ স্টিভেনেট বলেছেন: এই স্ক্রিপ্টটি শক্তিশালী নয়, তবে সাধারণ ক্ষেত্রে কাজ করে।

আশা করি এটি কার্যকর।


1

patch --strip=nবিকল্প মত চেহারা প্রয়োজন

patch --strip=number(বা -pnumber) এর মতো বিকল্প থাকা বাঞ্ছনীয় হবে numberযা শুরুতে চপস পাথের উপাদানগুলি (রেফ। তুলনা এবং ফাইলগুলি মার্জ করা: প্যাচ ডিরেক্টরিগুলি )।

অন্যান্য সমাধান, প্রযোজ্যতা

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

যখন এই সমাধানটি কাজ করে এবং @ গিলসের সমাধান পাওয়া যায়, তবে পরবর্তীগুলিও কাজ করবে। তবুও এই সমাধানটির জন্য FUSE ফাইল সিস্টেমের উপলব্ধতার প্রয়োজন হয় না।

এটা কিভাবে করতে হবে

ধরে নিই যে আপনি অতিরিক্ত ডিরেক্টরি জানেন, আপনার ক্ষেত্রে omeka-1.5.1, আপনি এটি করতে পারেন:

mkdir omeka
ln -s . omeka/omeka-1.5.1 # create a symlink that redirects output
unzip omeka-1.5.1.zip -d omeka/
rm omeka/omeka-1.5.1 # remote symlink

unzipআনজিপ করার চেষ্টা করবে omeka-1.5.1যা আসলে ডায়ার সংলগ্নের একটি সিমিলিংক। ফলস্বরূপ, ফাইলগুলি omekaসরাসরি অবতরণ করবে ।

সম্ভাব্য রূপগুলি

ডিপিয়ার হায়ারার্কির এক বা একাধিক অংশ পুনর্নির্দেশের জন্য আপনি রূপগুলি কল্পনা করতে পারেন।

ln -s ../myfoo omeka/omeka-1.5.1/foo
ln -s ../../mybarxyzzy omeka/omeka-1.5.1/subdir/bar

উপসংহার

এই সমাধানটি কিছুটা সুনির্দিষ্ট, তবুও এটির ব্যবহারের কেস রয়েছে এবং আমি এটি ব্যবহার করার জন্য ঘটলাম।


পথ চেনলে দুর্দান্ত সমাধান!
গ্রেপসেডক

প্রথমে জিপ সামগ্রী তালিকাভুক্ত করে পাথটি অনুসন্ধান করা যেতে পারে unzip -l। এমনকি এটি এমন কোনও স্ক্রিপ্ট ব্যবহার করে স্বয়ংক্রিয় করা যেতে পারে যা সাধারণ যে পথটির কিছু অংশ খুঁজে বের করে।
স্টাফেন গৌরিচন

ওহ সম্পূর্ণ, আপনি যদি পথটি জানেন তবে এটি কেবল এক টন সহজ easier আমি আনজিপ-এলের সাথে কিছুটা সময় খেলেছি তবে আমি ব্যাকআপ হয়েছি বলে আমার ইচ্ছা থেকে এটি কিছুটা বেশি গ্রেপ / সেড / অ্যাজক ছিল।
13

zipinfo -1একটি ভাল শুরু হতে পারে। আপনার ব্যবহারের ক্ষেত্রে কী?
স্টাফেন গ্যারিচন

github.com/grepsedawk/wow-config/blob/… এক্ষেত্রে , আমি ডিরেক্টরিটি জানি :)
গ্রেপসেডক

1

সম্ভবত আপনি বিকল্পটি unzipদিয়ে চালাতে চান -j:

unzip -j files.zip -d ./output/

তবে আপনি এর আচরণ দেখে অবাক হতে পারেন:

-জে জাঙ্ক পাথ। সংরক্ষণাগারটির ডিরেক্টরি কাঠামোটি পুনরায় তৈরি করা হয়নি; সমস্ত ফাইলগুলি নিষ্কাশন ডিরেক্টরিতে জমা হয় (ডিফল্টরূপে, বর্তমানটি)।

আপনি যদি files.zipআউটপুট ডিরেক্টরিতে নিষ্কাশন করেন ./outputএবং ফলস্বরূপ এটি পান:

./output/files/subfolder1/f1
./output/files/subfolder1/f2

তারপরে -jবিকল্পটি আপনাকে এগুলি দেবে (সমস্ত রাস্তার স্ট্রিপগুলি):

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