আমি একটি ডিরেক্টরিতে সমস্ত খালি ফোল্ডার মুছে ফেলার চেষ্টা করছি। যাইহোক, find . -type f -empty
কিছুই খুঁজে পায় না কারণ প্রতিটি ফোল্ডারে একটি লুকানো .svn
ফোল্ডার থাকে।
আমি কীভাবে এটিকে ঘিরে কাজ করতে পারি?
আমি একটি ডিরেক্টরিতে সমস্ত খালি ফোল্ডার মুছে ফেলার চেষ্টা করছি। যাইহোক, find . -type f -empty
কিছুই খুঁজে পায় না কারণ প্রতিটি ফোল্ডারে একটি লুকানো .svn
ফোল্ডার থাকে।
আমি কীভাবে এটিকে ঘিরে কাজ করতে পারি?
উত্তর:
আপনি যদি পারেন তবে প্রথমে সমস্ত .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
, অন্য কোনও ফাইল বা ফোল্ডার না থাকলে মুছে ফেলা হবে)।
গৌণ পরিবর্তন (কেবলমাত্র ডিরেক্টরি এবং পাইপটি 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
। এটি ডিরেক্টরি খালি হওয়ার সাথে সাথে এসএনএন থেকে ডিরেক্টরিগুলি সরানোর যত্ন নেবে।
আমি কেবল এটির জন্য হোঁচট খেয়েছি এবং আমি এই স্ক্রিপ্টটি ব্যবহার করেছি তবে কেবলমাত্র .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
সাদা স্থান, 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
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
।
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
.svn
ডিরেক্টরি খালি?