কিছু ফোল্ডারে গ্রুপ ফাইল


12

আমি যেমন বিভিন্ন এক্সটেনশনগুলি সহ কিছু ফাইল আছে *.pdf, *.mp3, *.jpgঅন্য কয়েকজন এবং। এগুলির সমস্ত একটি parentডিরেক্টরিতে সংরক্ষিত ।

আমি কীভাবে সমস্ত এক্সটেনশনের একটি তালিকা পেতে পারি, এই এক্সটেনশনের উপর ভিত্তি করে কিছু ফোল্ডার তৈরি করতে পারি এবং তারপরে সমস্ত ফাইলগুলিকে তাদের প্রাসঙ্গিক ফোল্ডারে স্থানান্তর করতে পারি?

উত্তর:


13

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

যেহেতু এটি বিস্তৃত উদ্দেশ্যে ব্যবহার করা যেতে পারে তাই আমি কয়েকটি বিকল্প যুক্ত করেছি:

  • আপনি "পুনর্গঠন" থেকে বাদ দিতে চান এমন এক্সটেনশানগুলি সেট করতে পারেন। আপনি যদি কেবল সমস্ত স্থানান্তর করতে চান তবে সেট করুনexclude = ()
  • খালি ফোল্ডারগুলি ( remove_emptyfolders = Trueবা False) দিয়ে কী করতে হবে তা আপনি চয়ন করতে পারেন
  • আপনি যদি ফাইলগুলি সরানোর পরিবর্তে অনুলিপি করতে চান তবে লাইনটি প্রতিস্থাপন করুন:
shutil.move(subject, new_dir+"/"+name)

দ্বারা:

shutil.copy(subject, new_dir+"/"+name) 

এই পান্ডুলিপি:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
            new_dir = reorg_dir+"/"+extension[1:]
            if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            shutil.move(subject, new_dir+"/"+name)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

যদি অযাচিত ওভাররাইটিং ডুপ্লিকেট ফাইলগুলির ঝুঁকি থাকে

কয়েকটি অতিরিক্ত লাইন ব্যয় করে আমরা সম্ভাব্য সদৃশগুলিকে ওভাররাইটিং প্রতিরোধ করতে পারি। নীচের কোড সহ, সদৃশদের নাম পরিবর্তন করা হবে:

duplicate_1_filename, duplicate_2_filename 

প্রভৃতি

এই পান্ডুলিপি:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
            new_dir = reorg_dir+"/"+extension[1:]
            if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            n = 1; name_orig = name
            while os.path.exists(new_dir+"/"+name):
                name = "duplicate_"+str(n)+"_"+name_orig
                n = n+1
            newfile = new_dir+"/"+name
            shutil.move(subject, newfile)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

সম্পাদনা

ওপিকে মাথায় রেখে, আমরা সকলে কীভাবে ব্যবহার করব সে সম্পর্কে একটি নির্দেশ যুক্ত করতে ভুলে গিয়েছিলাম। যেহেতু সদৃশ প্রশ্নগুলি ( এবং কর ) প্রদর্শিত হতে পারে, তবুও এটি কার্যকর হতে পারে।

কিভাবে ব্যবহার করে

  1. যে কোনও একটি স্ক্রিপ্টকে খালি ফাইলে অনুলিপি করুন, এটি সংরক্ষণ করুন reorganize.py
  2. স্ক্রিপ্টের প্রধান বিভাগে, লক্ষ্যযুক্ত ডিরেক্টরিটি সেট করুন (ফাইলগুলি পুনরায় সাজানোর জন্য):

    reorg_dir = "/path/to/directory_to_reorganize" 

    (ডিরেক্টরিতে ফাঁকা স্থান থাকলে কোট ব্যবহার করুন)

    সম্ভাব্য এক্সটেনশনগুলি আপনি বাদ দিতে চান (সম্ভবত কোনওটি নয়, নীচের মতো):

    exclude = ()

    এবং আপনি যদি পরে খালি ফোল্ডারগুলি মুছে ফেলতে চান:

    remove_emptyfolders = True
  3. কমান্ডটি দিয়ে স্ক্রিপ্টটি চালান:

    python3 /path/to/reorganize.py

এনবি যদি আপনি সরানোর পরিবর্তে ফাইলগুলি অনুলিপি করতে চান তবে প্রতিস্থাপন করুন:

shutil.move(subject, new_dir+"/"+name)

দ্বারা:

shutil.copy(subject, new_dir+"/"+name)

একটি ছোট নমুনায় প্রথমে চেষ্টা করুন।


12

আপনি findকিছুটা জটিল execকমান্ড দিয়ে ব্যবহার করতে পারেন :

find . -iname '*?.?*' -type f -exec bash -c 'EXT="${0##*.}"; mkdir -p "$PWD/${EXT}_dir"; cp --target-directory="$PWD/${EXT}_dir" "$0"' {} \;

# '*?.?*' requires at least one character before and after the '.', 
# so that files like .bashrc and blah. are avoided.
# EXT="${0##*.}" - get the extension
# mkdir -p $PWD/${EXT}_dir - make the folder, ignore if it exists

প্রতিস্থাপন cpসঙ্গে echoএকটি শুষ্ক চালানোর জন্য।


bashএকটি স্ক্রিপ্টে কমান্ডটি সংরক্ষণ করার জন্য আরও দক্ষ এবং পরিশ্রমী হবে (বলুন /path/to/the/script.sh)

#! /bin/bash

for i
do
    EXT="${i##*.}" 
    mkdir -p "$PWD/${EXT}_dir"
    mv --target-directory="$PWD/${EXT}_dir" "$i" 
done

এবং তারপরে চালান find:

find . -iname '*?.?*' -type f -exec /path/to/the/script.sh {} +

এই পদ্ধতিটি বেশ নমনীয়। উদাহরণস্বরূপ, এক্সটেনশন ( filename.ext) এর পরিবর্তে ফাইলের নামটি ব্যবহার করতে , আমরা এটির জন্য এটি ব্যবহার করব EXT:

NAME="${i##*/}"
EXT="${NAME%.*}"

+1 টি; -iname '*.*'কোণ ক্ষেত্রে আমি ... চমৎকার ধারণা চিন্তিত ছিলাম যত্ন নিতে হবে!
রোমানো

@ রমনো একটি *.fig.bakবা এক .profile/.bashrcনয়, তবে এটি কেবল কমপক্ষে এক্সটেনশান সহ ফাইলগুলি পরিচালনা করতে হবে। ধন্যবাদ।
মুড়ু

6
ls | gawk -F. 'NF>1 {f= $NF "-DIR"; system("mkdir -p " f ";mv " $0 " " f)}'

এক্সটেনশনের তালিকা গণনা করা (সরানোর পরে):

ls -d *-DIR

এক্সটেনশনের তালিকা গণনা করা (সরানোর আগে):

ls -X | grep -Po '(?<=\.)(\w+)$'| uniq -c | sort -n

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


1
দুঃখিত: একটি টাইপ "mkdir -f" "mkdir -p" এ সংশোধন করা হয়েছিল (dir ইতিমধ্যে উপস্থিত থাকলে তা উপেক্ষা করার জন্য)

ইউনিককে সাজানোর পরে প্রয়োগ করার কথা নয়? এবং দয়া করে ls এর আউটপুটটিকে বিশ্লেষণ করবেন না।
মুরু

@ মুরু, (অংশ 1) এলএস-এক্স গ্যারান্টি দেয় যে এক্সটেনশানগুলি সাজানো হয়েছে। প্রাসঙ্গিকতা - সংক্রমণের সংখ্যার দ্বারা এক্সটেনশন টেবিলটি অর্ডার করার জন্য চূড়ান্ত সাজানো ছিল। (আমি কি সঠিক?)।

@ মুরু, (অংশ 2) ls -X | grep -Po '(?<=\.)(\w+)$'এক্সটেনশানগুলির বাছাই করা তালিকা পেতে আমার প্রথম ধারণা ছিল। এটা খুব খারাপ? আপনি কি পরামর্শ দিচ্ছেন?

আমি কি ভুলে গেছি ls -X। কেন আমি এর বিপরীতে সুপারিশ করছি ls, unix.stackexchange.com/q/128985/70524 এবং unix.stackexchange.com/q/112125/70524 দেখুন । আপনি যা করেন তা অর্জন করতে, আমি আরও দীর্ঘ পথ যেতে চাই: find . -type f -name '*?.?*' -print0 | sed -z 's/.*\.//' | sort -zu(একটি optionচ্ছিক সাথে | uniq -cz, যদি গণনা প্রয়োজন হয়)। এবং find ... -print0 | gawk -v RS='\0'(যদিও এটি খুব বহনযোগ্য নয় ) প্রথমটির জন্য।
মুরু

5

এই শেল স্ক্রিপ্ট চেষ্টা করুন।

#!/bin/sh
src=`dirname "$1"`/`basename "$1"`;
for file in "$src"/*?.?*; do
  if test -f "$file"; then
    dest="$src${file##*.}"_files;
    mkdir -p "$dest";
    mv "$file" "$dest";
  fi;
done;

# pass the directory to re-organize as first argument
# moves only regular files which have extension
# ignores other type of files including
# files having no extension, hidden files, directories, and links.

1
আমি দুঃখিত, এটি একটি ত্রুটি। আমি প্রতিটি ঘটনা প্রতিস্থাপিত করতে হবে filepathসঙ্গে file। আমি সরাসরি এটি সংশোধন করব।
প্রশান্ত কর্মকার

দয়া করে ls এর আউটপুটটিকে বিশ্লেষণ করবেন না। পরিবর্তে, করুনfor file in "$src"/*?.?*; do ..
মুরু

@ মুরু যদি কিছু ফাইলের নামের ফাঁকা জায়গা থাকে তা কি সঠিকভাবে কাজ করবে?
প্রশান্ত কর্মকার

@ প্রশান্তকর্মাকার হ্যাঁ, readঅপ্রত্যাশিত আচরণ থাকতে পারে। আপনি mkdir এবং mv কমান্ডের মধ্যে ভেরিয়েবলগুলি উদ্ধৃত করা উচিত।
মুরু

এটি পরীক্ষা করুন, যদি আপনি হবে:for i in *; do printf "%s\n" "$i"; done; for i in $(ls -d); do printf "%s\n" "$i"; done
muru

2

আপনার যদি পার্লের নাম / পূর্ব নাম ইনস্টল করা থাকে:

rename 's!(.*)\.(\w+)$! mkdir($2); "$2/$&"!ge'  *
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.