পুনরাবৃত্ত ডিরেক্টরি থেকে একটি নির্দিষ্ট নামযুক্ত ফোল্ডার কীভাবে সরিয়ে নেওয়া যায়, অন্যগুলি মুছবেন?


10

আমার কাছে এই জাতীয় ডিরেক্টরি ট্রি রয়েছে যা একটি জিপ ফাইল আনজিপিং থেকে প্রাপ্ত:

এক্স -> y -> z -> চালান -> ফাইল এবং নির্দেশাবলী এখানে

সুতরাং 4 টি ডিরেক্টরি রয়েছে যার মধ্যে 3 টি ফাইল খালি (x, y, z) এবং কেবলমাত্র 1 টি সাব-ডিরেক্টরি রয়েছে এবং সেখানে আমি আগ্রহী এমন ডিরেক্টরি রয়েছে যার নাম " রান " রয়েছে।

আমি "চালিত" ডিরেক্টরিটি নিজেই (সমস্ত কিছু অন্তর্ভুক্ত) যেখানে "আনজিপড" (যেখানে "এক্স" রয়েছে, তবে "x" এর অভ্যন্তরে নয়) "রুট" অবস্থানে নিয়ে যেতে চাই।

অনুমানগুলি: "রান" নামে একটি ফোল্ডার রয়েছে , তবে আমি জানি না যে এটির জন্য আমাকে "সিডি" করতে হবে (3 (x, y, z) হতে পারে, 10 বা তার বেশি হতে পারে The নামগুলি The এছাড়াও অজানা এবং x, y, z ইত্যাদি হতে হবে না)।

আমি কীভাবে এটি সম্পাদন করতে পারি? আমি এই প্রশ্নের বিভিন্ন প্রকারের চেষ্টা করেছি কিন্তু তারা সবই ব্যর্থ হয়েছিল।


1
আমি ভীত ছবিটি খুব পরিষ্কার নয়, না। পাঠ্যের স্ক্রিনশট পোস্ট করবেন না দয়া করে । পরিবর্তে, পাঠ্যটি সরাসরি আপনার প্রশ্নের মধ্যে পেস্ট করুন এবং বিন্যাসকরণ সরঞ্জামগুলি ব্যবহার করুন । আমি আপনার ছবিতে ডিরেক্টরি নামটিও পড়তে পারি না। আমি যা দেখছি তা সবই ধূসর নীল অস্পষ্ট।
টেরডন

উত্তর:


14

কি সম্পর্কে

  find . -type d -name run -exec mv {} /path/to/X \;

কোথায়

  • / পাথ / থেকে / এক্স আপনার গন্তব্য ডিরেক্টরি
  • আপনি এই একই জায়গা থেকে শুরু।
  • তারপরে খালি ডিরেক্টরিগুলি সরানোর জন্য অন্যান্য উত্তর ব্যবহার করুন।

(সাইড নোটে --junk-pathsজিপে একটি বিকল্প রয়েছে, হয় জিপ করা বা আনজিপ করার সময়)


7

আমি এটি bashব্যবহার করে করব globstar। হিসাবে ব্যাখ্যা করা হয়েছে man bash:

globstar
      If set, the pattern ** used in a pathname expansion con‐
      text will match all files and zero or  more  directories
      and  subdirectories.  If the pattern is followed by a /,
      only directories and subdirectories match.

সুতরাং, ডিরেক্টরিটি runশীর্ষ স্তরের ডিরেক্টরিতে স্থানান্তরিত করতে xএবং তারপরে বাকীটি মুছতে আপনি করতে পারেন:

shopt -s globstar; mv x/**/run/ x/  && find x/ -type d -empty -delete

shoptকমান্ড সম্ভব globstarবিকল্প। এটি mv x/**/run/ x/নামের runযে কোনও উপ-ডিরেক্টরিকে (নোট করুন যে এটি কেবলমাত্র একটি runডিরেক্টরি থাকলে কেবল এটি কাজ করে ) সরিয়ে নিয়ে যাবে xএবং findখালি ডিরেক্টরিগুলি মুছে ফেলবে।

আপনি যদি পছন্দ করেন তবে প্রসারিত গ্লোববিংয়ের সাহায্যে শেলটিতে পুরো জিনিসটি করতে পারতেন, তবে find -emptyখালি কোনও ডিরেক্টরি খালি নেই তা নিশ্চিত হওয়ার জন্য আমি সুরক্ষা জেলটিকে পছন্দ করি । আপনি যদি সে সম্পর্কে যত্ন না পান তবে আপনি এটি ব্যবহার করতে পারেন:

shopt -s globstar; shopt -s extglob; mv x/**/run/ x/ && rm -rf x/!(run)

6

অবশ্যই আরও ভার্বোজ, তবে কাজটি এক ধাপে করছেন:

ধরে নিচ্ছি আপনি পাইথন ইনস্টল করেছেন

#!/usr/bin/env python3
import shutil
import os
import sys

dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    # find your folder "run"
    for pth in [d for d in dirs if d == sys.argv[2]]:
        # move the folder to the root directory
        shutil.move(os.path.join(root, pth), os.path.join(dr, pth))
        # remove the folder (top of the tree) from the directory
        shutil.rmtree(os.path.join(dr, root.replace(dr, "").split("/")[1]))

ব্যবহারবিধি

  1. একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন get_folder.py
  2. যুক্ত ডিরেক্টরি হিসাবে এটি "উত্তোলন" করতে মূল ডিরেক্টরিটি (আপনার আনজিপড স্টাফগুলি সংযুক্ত করে) এবং ফোল্ডারের নাম দিয়ে চালান:

    python3 /full/path/to/get_folder.py /full/path/to/folder_containing_unzipped_dir run
    

এবং এটি করা হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


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

সমস্যা নেই. এটি অন্য কারও কাজে লাগতে পারে। জানতে আগ্রহী কেন? আমি নিশ্চিত যে অনেক অ্যাপ্লিকেশন ইতিমধ্যে পাইথন ব্যবহার করে।
জ্যাকব ভিলিজম

মূলত যেহেতু .py ফাইল স্থাপন করা সমস্যাযুক্ত হবে কারণ আমি ধরে নিতে হবে যে এটি প্রতিটি লিনাক্স মেশিনের জন্য একই স্থানে রয়েছে যা আমার স্ক্রিপ্টটি চালাচ্ছে (এবং আমার স্ক্রিপ্টটি অনেক প্ল্যাটফর্ম জুড়ে চলছে)
আইডোস

@ আইডোস কি কৌতূহলী, কোন প্ল্যাটফর্ম? পাইথন বেশ বিস্তৃত। আমি মনে করি না এটি ম্যাক ওএস এক্সে ডিফল্টরূপে ইনস্টল করা আছে তবে বেশিরভাগ লিনাক্স বিতরণে এটি রয়েছে
সের্গি কলডিয়াজহনি

4

পার্ল সমাধান

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
use File::Copy::Recursive qw(dirmove);

my @wanted;
find(sub{ -d $_ && $_ eq "run" && push @wanted,$File::Find::name}, $ARGV[0]);
dirmove("$wanted[0]","./run");

যেভাবে এটি কাজ করে তা সহজ: find()সাবরুটাইন প্রদত্ত ডিরেক্টরি ট্রিটিকে পুনরাবৃত্তভাবে অতিক্রম করবে, যার নাম সেই ডিরেক্টরিটি আবিষ্কার করবে runএবং এটি ফাইলের নামগুলির অ্যারেতে ঠেলে দেবে। এই ক্ষেত্রে, আমরা ধরে নিই যে তালিকার মধ্যে কেবল একটি ফাইল থাকা উচিত, সুতরাং কমান্ডটি শেষ হয়ে গেলে, আমরা মডিউলটি dirmove()থেকে ব্যবহার করি File::Copy::Recursiveএবং এটি বর্তমান কর্মনির্দেশক ডিরেক্টরিতে স্থানান্তর করি যা থেকে স্ক্রিপ্ট বলা হয়েছিল। এইভাবে আপনার ক্ষেত্রে আপনি এটি পিতামাতার ডিরেক্টরি থেকে কল করবেন x

মূল ডিরেক্টরি গাছ:

$ tree                                                                                                                   
.
└── levelone
    └── leveltwo
        └── levelthree
            └── run
                ├── file1
                ├── file2
                └── file3

ফলাফল:

$ ~/find_dir.pl .  
$ tree 
.
├── levelone
│   └── leveltwo
│       └── levelthree
└── run
    ├── file1
    ├── file2
    └── file3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.