এটিতে .svn ফোল্ডার সহ সমস্ত খালি ফোল্ডার মুছুন


6

আমি একটি ডিরেক্টরিতে সমস্ত খালি ফোল্ডার মুছে ফেলার চেষ্টা করছি। যাইহোক, find . -type f -emptyকিছুই খুঁজে পায় না কারণ প্রতিটি ফোল্ডারে একটি লুকানো .svnফোল্ডার থাকে।

আমি কীভাবে এটিকে ঘিরে কাজ করতে পারি?


হয় .svnডিরেক্টরি খালি?
ডেনিস উইলিয়ামসন

না তারা না. আমি মনে করি ওলিস সলিউশন কাজ করবে। তবে, আমি এখনও এটি পরীক্ষা করিনি।
atamanroman

উত্তর:


1

আপনি যদি পারেন তবে প্রথমে সমস্ত .svnফোল্ডার মুছে ফেলতে পারেন । খারাপ দিক: যদি কেউ এসভিএন ব্যবহার করে থাকে তবে আপনি সংস্করণ নিয়ন্ত্রণের তথ্য হারাবেন। যদি কেউ এসভিএন ব্যবহার করে থাকে তবে কেবল সেই ফোল্ডারগুলি সরিয়ে ফেলা ভাল নয় (বা আসলে আপনাকে এসভিএন থেকে সেগুলিও সরিয়ে ফেলতে হবে, কারণ এসভিএন ফোল্ডার এবং ফাইলগুলি ট্র্যাক করছে)।

যদি এটি সম্ভব না হয় তবে আমি স্ক্রিপ্টিং রুট নিয়ে যাব:

for folder in $(find . -type d); do
 if [ "`ls $folder | wc -l`" -eq 0 ]; then
  echo "I am going to delete $folder"
 fi
done

প্রথমে পরীক্ষা চালানোর চেষ্টা করুন, কারণ এতে অবাক হওয়ার মতো কিছু থাকতে পারে। তারপরে আপনি rm -rতার পরিবর্তে পরিবর্তন করতে পারেন echo

তবে নোট করুন, এটি কেবল ডট-ফাইলযুক্ত সমস্ত ফোল্ডার সরিয়ে ফেলবে (উদাহরণস্বরূপ a/.this_is_super_important, অন্য কোনও ফাইল বা ফোল্ডার না থাকলে মুছে ফেলা হবে)।


3

গৌণ পরিবর্তন (কেবলমাত্র ডিরেক্টরি এবং পাইপটি xargsপরে মুদ্রণ করুন ):

for folder in $(find -type d ! -path *.svn*); do
  if [ "`find $folder ! -path *.svn* ! -path $folder | wc -l`" -eq 0 ]; then
    echo $folder
  fi
done

এটিকে আপনার কোথাও রাখুন $PATH, সম্ভবত svn-emptiesপ্রথম রান করুন:

svn-empties

এটি যে ডিরেক্টরিগুলি খুঁজে পেয়েছে তার তালিকা তৈরি করতে (প্রয়োজনে তালিকার সংশোধন করুন) এবং তারপরে পাইপ করুন xargs:

svn-empties | xargs svn rm

এই স্ক্রিপ্টটি ব্যবহার করার সময় আমার জন্য খুব দরকারী হয়ে উঠেছে git-svn(ধন্যবাদ!) যেহেতু gitখালি ডিরেক্টরিগুলি ট্র্যাক করে না আমি সাবভার্সন সংগ্রহস্থলের অনেকগুলি খালি ডিরেক্টরি দিয়ে শেষ করতে পারি। আমি svn coসংগ্রহস্থলের আলাদা কপি করি এবং svn-empties | xargs svn rmপর্যায়ক্রমে চালাই । প্রথমে সাবভারশন ব্যবহার করা আমার সিদ্ধান্ত ছিল না;)


আপনি যদি ব্যবহার করেন তবে git-svnআপনি --rmdirবিকল্পটি ব্যবহার করতে চাইতে পারেন git svn dcommit। এটি ডিরেক্টরি খালি হওয়ার সাথে সাথে এসএনএন থেকে ডিরেক্টরিগুলি সরানোর যত্ন নেবে।
gioele

2

আমি কেবল এটির জন্য হোঁচট খেয়েছি এবং আমি এই স্ক্রিপ্টটি ব্যবহার করেছি তবে কেবলমাত্র .svn এবং অন্য কোনও ফাইল লুকানো বা সাধারণ নয় এমন খালি ডায়ারগুলি সঠিকভাবে বিবেচনা করার জন্য এটিকে পরিবর্তন করেছিলাম।

এছাড়াও, মনে রাখবেন যে আমি এসএনএন আরএম ব্যবহার করছি, সুতরাং এটি কোনও ভাণ্ডারের বিপরীতে কাজ করার কথা মনে করা হয়, আপনি ডিরেক্টরিতে ভিন্ন কিছু করার জন্য স্ক্রিপ্টটি মানিয়ে নিতে পারেন।

for folder in $(find -type d ! -path *.svn*); do
  if [ "`find $folder ! -path *.svn* ! -path $folder | wc -l`" -eq 0 ]; then
    svn rm $folder
  fi
done

0

সাদা স্থান, findএবং IFSযাদু সম্পর্কিত সমস্যাগুলি এড়াতে (ফাইলের নামগুলিতে আসলে নতুন লাইনও থাকতে পারে, সুতরাং IFS=$'\n'এটি কোনও রূপালী বুলেট নয়), কেউ গ্লোব এবং অ্যারে ব্যবহার করতে পারে।

#!/bin/bash
search_dir=${1:-.}
shopt -s globstar dotglob
for svn_dir in "$search_dir"/**/.svn/; do
    base_dir=${svn_dir%/.svn/}
    base_dir_contents=("$base_dir"/*)
    if [ ${#base_dir_contents[@]} -eq 1 ]; then
        printf 'The directory "%s" only contains ".svn/".\n' "$base_dir"
    fi
done
  • স্ক্রিপ্টটি একটি pathচ্ছিক পাথ আর্গুমেন্ট গ্রহণ করে, বা অনুপস্থিত থাকলে বর্তমান পথটি ডিফল্ট হিসাবে ব্যবহার করে।
  • globstarডিরেক্টরিটি ট্র্যাভারসিং **কনস্ট্রাক্ট সক্ষম করে ।
  • dotglob তারকাচিহ্ন গ্লোবগুলিতে লুকানো ফাইলগুলি অন্তর্ভুক্ত করে।
  • forউল্লিখিত glob কোনো সমস্যাযুক্ত ডিরেক্টরির নাম অক্ষর বিরুদ্ধে নিরাপদ হওয়া উচিত। Globs হবে সবসময় ব্যাশ নিরাপদে প্রসারিত করবে, যা দিয়ে ঘটনা না ls, findইত্যাদি চিহ্ন স্ল্যাশ নিশ্চিত আমরা কেবল মেলে তোলে ফোল্ডার নামে .svnএবং নিয়মিত ফাইল (ক বাস্তব কোণ ক্ষেত্রে, যদিও)।
  • মেলে থাকা .svnডিরেক্টরি সহ ফোল্ডারে থাকা ফাইলগুলির নামগুলি একটি অ্যারেতে গ্লোবড করা হয়। যদি এই অ্যারেতে আইটেমের সংখ্যা 1 হয় (যেমন .svnআমরা যে ফোল্ডারটি নির্মাণ করে জানি * সেখানে আছে), তবে এটি আমরা যা খুঁজছি।

এটি কেবল বাশ অন্তর্নির্মিত ব্যবহার করে এবং এটির জন্য অতিরিক্ত সিস্টেমের কাঁটাচামচ দেওয়ার চেয়ে দ্রুত হওয়া উচিত find, তবে পার্থক্যটি সম্ভবত লক্ষণীয় নয় এবং যাইহোক I / O মূল বাধা হয়ে দাঁড়াবে।


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


আরেকটি দ্রুত উল্লেখ করা হ'ল অন্যান্য উত্তরগুলির উচিত তাদের *.svn*বিস্তৃতি উদ্ধৃত করা । অন্যথায় findকমান্ডটি ব্যর্থ হবে যদি বর্তমান ফোল্ডারে এমন কোনও ফাইল থাকে যা সেই গ্লোবটির সাথে মেলে:

$ mkdir foo && cd foo
$ mkdir -p test1/.svn test2
$ find -type d ! -path *.svn*
.
./test1
./test2
$ touch foo.svnbar
$ find -type d ! -path *.svn*
.
./test1
./test1/.svn
./test2
$ find -type d ! -path "*.svn*"
.
./test1
./test2

উদ্ধৃতি ব্যতীত *.svn*শেল দ্বারা অকাল সময়ের সাথে প্রসারিত হবে foo.svnbar


0
  1. সমস্যার সমাধান করেছেন যে: পথের ফাঁকা জায়গা
  2. PATH প্যারামিটার সহ স্ক্রিপ্টটি কল করতে পারে:

svn-empties YOU_WANT_TO_SEARCH_PATH

C_IFS=$IFS

IFS=$'\n'

for folder in $(find "$1" -depth -type d ! -path *.svn*|sort -r); do
  counts=$(find "$folder" -type f ! -path *.svn* ! -path $folder | wc -l)

  if [ $counts -eq 0 ]; then
    echo $folder
  fi

done

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