'ওভাররোট' ফাইল, স্থান এখনও দখল করা আছে, সেগুলি কি হারিয়ে গেছে?


11

তাই বোবা অধৈর্য আমার 19.04 সার্ভারে উপস্থাপিত ফাইলগুলির একটি গুচ্ছ ফোল্ডারে স্থানান্তরিত করার চেষ্টা করার জন্য নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করেছিল:

dirs=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
shopt -s nocasematch

for file in *
do
    for dir in "${dirs[@]}"
    do

     if [ -d "$file" ]; then
      echo 'this is a dir, skipping'
      break
     else
      if [[ $file =~ ^[$dir] ]]; then
       echo "----> $file moves into -> $dir <----"
       mv "$file" "$dir"
       break
      fi
     fi
  done
done

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

----> a1.ts moves into -> A <----
----> a2.ts moves into -> A <----
----> a3.ts moves into -> A <----
----> a4.ts moves into -> A <----
----> a5.ts moves into -> A <----
----> c1.ts moves into -> C <----
----> c2.ts moves into -> C <----
----> c3.ts moves into -> C <----
----> c4.ts moves into -> C <----
----> c5.ts moves into -> C <----

আমি ভাগ্যক্রমে প্রক্রিয়াটি বন্ধ করে দিয়েছিলাম (সিটিআরএল + সি) যত তাড়াতাড়ি আমি লক্ষ্য করেছি যে এটি উদ্দেশ্য হিসাবে চলছে না এবং পুরো ফোল্ডারে যায় নি।

সুতরাং এখন আমি এই ফাইলগুলি পেয়েছি Aএবং Cযা কোনও গিগাবাইটের চেয়ে কম, এবং এটির দ্বারা একটি সিঙ্গল ভিডিও।

ফোল্ডারটি নিজেই মোট ডিস্ক ব্যবহারের ক্ষেত্রে 50 জিবিবিহীন অ্যাকাউন্ট রয়েছে, তবে কম্পিউটারের সামগ্রিক ডিস্কের স্থান একই থাকে। ফাইলগুলি মুছে ফেলা হচ্ছে না আমাকে ভাবা হচ্ছে?

কোন সাহায্য প্রশংসা, ধন্যবাদ :)

সম্পাদনা করুন: ফাইলগুলি প্রকৃতপক্ষে চলে গেছে, কেবলমাত্র শেষ ফাইলটি লিখিত থাকতে হবে, ডিস্ক ব্যবহারের তথ্য আপডেট করার জন্য এটি কিছুটা সময় নিয়েছিল .. গল্পটির নৈতিকতা, আপনার স্ক্রিপ্টগুলি মক ফাইলগুলিতে চালানোর আগে!


3
এবং ডিরেক্টরিগুলির নামকরণ A, Bএবং কি স্ক্রিপ্ট চালানোর আগে অস্তিত্ব ছিল? না হলে আপনি কেবল ফাইলগুলির নাম পরিবর্তন করেছেন। সমস্ত ফাইল যা নামগুলির সাথে শুরু হয়েছিল aবা নাম Aপরিবর্তন করা হয়েছে A, তাই কেবলমাত্র সর্বশেষ নাম পরিবর্তন করা ফাইলটি বেঁচে গেছে, অন্যগুলি ওভাররাইট করা হয়েছে। একটি ভেরিয়েবল কল dirকরতে একটি ডিরেক্টরি তৈরি করে না!
mook765

2
এটি যেমনভাবে এটি ব্যাখ্যা করেছে তেমনিভাবে এটিও চালিয়ে যায়। "সর্বশেষ নামকরণ করা ফাইলটি বেঁচে গেছে" হেক্টর। ডিরেক্টরি উপস্থিত ছিল না, আমার হাত আগে প্রতিটি জন্য একটি 'টাচ' যুক্ত করা উচিত ছিল। স্পষ্ট করার জন্য ধন্যবাদ
আমি

4
"1 এর জন্য .. গল্পটির নৈতিক, এর আগে আপনার স্ক্রিপ্টগুলি মক ফাইলগুলিতে চালান!"
সুডোডাস

4
এই জাতীয় সমস্যা এড়াতে একটি টিপ: mv "$file" "$dir/"একটি পিছনে সহ ব্যবহার করুন /; তারপর যদি $dirবিদ্যমান নয়, mvপুনঃনামকরণ পরিবর্তে ত্রুটি হবে $fileথেকে $dir। এছাড়াও বিবেচনা করুন mv -iএবং mv -nmkdir -pভাল পদক্ষেপের জন্য এবং সরানোর আগে সর্বদা একটি করুন ।
মার্সেলেম

3
@ সুডডাস আরও উন্নত নৈতিক, "সর্বদা আপনার ডেটা ব্যাকআপ করুন!"।
জন বেন্টলে

উত্তর:


15

আমি মনে করি এটি সমস্যা: আপনার ডিরেক্টরি এ, বি, সি ... জেড তৈরি করা উচিত ছিল If যদি আপনি করেন, mvকমান্ডটি সেই ডিরেক্টরিগুলিতে ফাইলগুলি সরিয়ে নেওয়া উচিত ছিল।

তবে যদি তা না হয়, mvকমান্ড সেই নামগুলি, এ, বি, সি ... সহ ফাইলগুলিতে ফাইলগুলিতে স্থানান্তরিত করে এবং আমি মনে করি আপনি এটি করেছিলেন।

শেলসক্রিপ্টটিকে আরও নিরাপদ করতে, আপনি চলন্ত শুরু করার আগে ডিরেক্টরিগুলি তৈরি করতে হবে (যদি তারা ইতিমধ্যে সেখানে না থাকে)।

dirs=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

for dir in "${dirs[@]}"
do
 mkdir -p $dir
done

আপনি এমনকি নিরাপদ পেতে কিছু চান, আপনি এছাড়াও ব্যবহার করতে পারেন mvসঙ্গে -iবিকল্প

   -i, --interactive
          prompt before overwrite

1
স্ক্রিপ্ট একাধিকবার চালানোর ক্ষেত্রে দ্বন্দ্ব এড়ানোর touchজন্য কী যুক্ত হওয়া ভাল হবে mkdir?
আমি

2
touchনামের উপস্থিতি না থাকলে একটি ফাইল তৈরি করে। সুতরাং এই ক্ষেত্রে আপনি যা চান তা তা করবে না। mkdir -pস্ক্রিপ্টটি বেশ কয়েকবার ব্যবহার করে পরিচালনা করতে পারে।
সুডোডাস

6
আপনি আরও mvনিরাপদ করতে পারবেন এমন আরও একটি সহজ উপায় হ'ল লক্ষ্য যখন ডিরেক্টরি হয় তখন লক্ষ্য নামের সাথে একটি পিছনে স্ল্যাশ যুক্ত করার অভ্যাসে প্রবেশ করাmv "$file" "$dir/"
স্টিল্ড্রাইভার

7

@ সুদোদাস ইতিমধ্যে ব্যাখ্যা করেছেন যে কী ভুল হয়েছে, তবে এখানে আপনার স্ক্রিপ্টটির পরবর্তী বারের জন্য একটি সহজ সংস্করণ:

for letter in {a..z}; do 
    dir=${letter^}
    mkdir -p -- "$dir" 
    mv -- "$letter"* "${letter^^}"* "$dir"/
done

ব্যাখ্যা

  • for letter in {a..z}; do: এবং এর {a..z}মধ্যে সমস্ত ছোট হাতের অক্ষরে প্রসারিত হয় :az

    $ echo {a..z}
    a b c d e f g h i j k l m n o p q r s t u v w x y z

    সুতরাং এটি প্রতিটি ছোট আকারের অক্ষরে পুনরাবৃত্তি হবে এবং প্রতিটি হিসাবে সংরক্ষণ করবে $letter

  • dir=${letter^}: সিনট্যাক্স ${var^^}ভেরিয়েবলের বিষয়বস্তু $varপ্রথম অক্ষরের সাথে উপরের ক্ষেত্রে দেয় (যেহেতু এটির কেবল একটি অক্ষর রয়েছে, আমাদের কেবল এটিই প্রয়োজন)। সুতরাং, যদি $letterহয় aতবে তা ${letter^^}হয় Aএবং তাই $dirবর্তমানের বড় হাতের সংস্করণ হবে $letter

  • mkdir -p -- "$dir": ডিরেক্টরি তৈরি করুন। এটি ইতিমধ্যে উপস্থিত থাকলে, কিছুই করবেন না ( -p)। -- অপশন শেষে প্রকাশ করে , এবং দিয়ে শুরু নমাগুলি রক্ষা করার জন্য দরকারী -
  • mv -- "$letter"* "${letter^}"* "$dir" : প্রতিটি ফাইল (বা ডিরেক্টরি) প্রাসঙ্গিক টার্গেটে সরান।

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

যদি সমস্যা হয় তবে আপনাকে এই জাতীয় কিছু করতে হবে:

for file in *; do 
    if [[ ! -d "$file" ]]; then 
        letter="${file:0:1}"
        dir="${letter^}"
        mkdir -p -- "$dir"
        mv -- "$file" "$dir"/
    fi
done

${letter^}এবং এর মধ্যে পার্থক্য কী ${letter^^}এবং তারা যদি অভিন্ন হয় তবে কেন ${letter^^}এর জায়গায় ব্যবহার করবেন $dir?
ফান্ড মনিকার লসুইট

1
@ নিক হার্টলি ${var^}কেবলমাত্র প্রথম অক্ষরকেই মূলধন করে, ${var^^}সমস্ত অক্ষরকে মূলধন করে। $letterকেবল এখানে একটি চিঠি রয়েছে বলে এটি এখানে কোনও পার্থক্য করে না ।
টেরডন

এই একটি নিখুঁত উত্তর ব্যতীত তোমাদের ডিরেক্টরির স্ল্যাশ যোগ করে সাবধানতার একটি অতিরিক্ত স্তর জুড়তে চাইতে পারেন $dirমধ্যে mvকমান্ড। (বর্তমান আকারে এটি ব্যর্থ হবে যদি কোনও ফাইলের একক-বর্ণের বড় হাতের অক্ষর যুক্ত থাকে)
স্টিগ হেমার

পছন্দ করেছেন খুব ভাল পয়েন্ট, ধন্যবাদ। উত্তর সম্পাদিত।
টেরডন

4

ডিকশনারি অ্যারের বিরুদ্ধে প্রতিটি ফাইল যাচাইয়ের পরিবর্তে যা প্রচুর পরিমাণে পুনরাবৃত্তি তৈরি করে আপনি সেই ফাইলগুলির সাথে নিদর্শনগুলির সাথে মেলে ফেলতে পারেন।

খুব মৌলিক সাজান:

#!/bin/bash

videos=./videos
sorted=./sorted

# sort types link,move.
sort_type=link

find "$videos" -maxdepth 1 -type f \
   \( -name '*.avi' -o -name '*.mkv' -o -name '*.mp4' \) -print0 |

while IFS= read -r -d ''; do

    b=$(basename "$REPLY")
    c=${b::1}

    case $c in
        [a-zA-Z]) label=${c^} ;; [0-9]) label="0-9" ;; *) label="_" ;;
    esac

    [[ ! -d "$sorted/$label" ]] && mkdir -p "$sorted/$label"

    if [[ -L $sorted/$label/$b ]] || [[ -e $sorted/$label/$b ]]; then
        echo "File/link: '$b' exists, skipping."
        continue
    fi

    case $sort_type in
        link)
            ln -rfst "$sorted/$label" -- "$REPLY"
            ;;
        move)
               mv -t "$sorted/$label" -- "$REPLY"
            ;;
    esac
done

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

কোনও আর্গুমেন্ট সরবরাহ না করা হলে রিয়েল বিল্টিন কমান্ড দ্বারা পঠিত ইনপুট লাইনে সেট করুন।
bac0n

ঠিক আছে এবং তারপরে শেষে আপনি ln -rfst "$ সাজানো / $ লেবেল" করেন - "$ উত্তর দিন" আমরা কেবল এমভি দিয়ে সরিয়ে দিলে উপনামটি কেন করবে?
আমি টিআই ক্যালকুলেটর

ডিফল্ট হিসাবে এটি আপনার বাছাই করা ডিরেক্টরিতে "ভিডিও" ডিরেক্টরি থেকে লিঙ্কগুলি তৈরি করে, আপনি যদি তাদের এমভি করতে চান তবে আপনাকে "সরানো ভিডিওগুলি" মন্তব্য করতে হবে এবং "লিঙ্ক ভিডিওগুলি" মন্তব্য করতে হবে (আমার মনে হয় সিমলিঙ্কগুলি কম ভীতিজনক)
bac0n

... দুজনে একই সাথে নয়।
bac0n

2

আপনার .Bashrc- এ সুরক্ষার ব্যবস্থা:

alias mv="mv -n --backup=numbered"

1
@ জান্না, তার জন্য ধন্যবাদ! যুক্ত উদ্ধৃতি।

.Zshrc ফাইলে যুক্ত করা ( জেডএসএইচ ব্যবহার করে) খুব কার্যকর কিনা তা নিশ্চিত হওয়ার জন্য কয়েকটি প্রশ্ন ( নবীনবী হওয়া )? মধ্যে মানুষ এমভি এরা বলছে -n Do not overwrite an existing file. (The -n option overrides any previous -f or -i options.)তাই এটা কোন ব্যাপার নয় যে -n ট্যাগ ট্যাগ অনুসরণ করার আগে হবে? - ব্যাকআপ = নম্বরযুক্ত প্রতিটি ডাবের দ্বিগুণ তৈরি করবে, উবার-লার্জ ভিডিও ফাইলগুলির সাথে কথা বলার সময় (কিছুটা টেরাবাইট) অল্প ওভারকিল (এবং স্থান শক্তি / গ্রাসকারী) নয়। ধন্যবাদ!
আমি

2

রেকর্ডের জন্য, mvবিদ্যমান ফাইলগুলি ওভাররাইট করা বন্ধ করার কিছু উপায় :

  • আপনি যদি কোনও ডিরেক্টরিতে যেতে চান তবে লক্ষ্যটিতে একটি স্ল্যাশ যুক্ত করুন, mv "$file" "$dir"/পরিবর্তে ব্যবহার করুন mv "$file" "$dir"। যদি $dirউপস্থিত না থাকে বা ডিরেক্টরি না থাকে mvতবে অভিযোগ করবে:

    $ touch a
    $ mv a z/
    mv: cannot move 'a' to 'z/': Not a directory
    $ touch z
    $ mv a z/
    mv: failed to access 'z/': Not a directory

    এটি সিস্টেম কল করতে পারে বলে মনে হচ্ছে rename("a", "z/"), তাই যদি কেউ একই সময়ে একই সেটগুলির ফাইলগুলি পরিচালনা করে থাকে তবে এটি ব্যবহারের সময়-সময়-ব্যবহারের দুর্বলতা থেকে নিরাপদ হওয়া উচিত।

  • বিকল্পভাবে, ব্যবহার করুন mv -t "$dir" "$file"। আবার, এটি $dirডিরেক্টরি না হলে অভিযোগ করবে isn't

  • -nবিদ্যমান ফাইলগুলিকে ওভাররাইট করা রোধ করতে বিকল্পটি ব্যবহার করুন :

    -n, --no-clobber
        do not overwrite an existing file

    এটি প্রথম ফাইলটির নাম পরিবর্তন করা থেকে বিরত রাখবে না, তবে এটি অন্যদের সাথে ট্র্যাশ করবে না।

    এটি সমভূমিটিকে কল বলে মনে হচ্ছে rename(), তাই এটি একইসাথে পরিচালনা সহ নিরাপদ নাও হতে পারে। ( renameat2()ওভাররাইটিং প্রতিরোধের জন্য এটি একটি পতাকা সমর্থন করবে))


1

আপাতদৃষ্টিতে আপনার ক্ষেত্রে এটি না হওয়ার পরেও সম্ভবত আপনি এটি করতে পেরেছেন এবং ফাইলগুলি হারাতে পারবেন না। এটির জন্য দুটি জিনিসের একটিকে সত্য হতে হবে:

  • একই সিস্টেমে এক বা একাধিক 'হার্ড লিঙ্কগুলি' ফাইল সিস্টেমে অন্য কোথাও বিদ্যমান
  • এক বা একাধিক প্রক্রিয়ার একটি ফাইল খোলা আছে

ইউনিক্স ফাইল সিস্টেমগুলি একাধিক ডিরেক্টরি এন্ট্রি মঞ্জুরি দেয় একই একই ফাইল সামগ্রীতে । একে ' হার্ড লিঙ্ক ' বলা হয়। সাধারণ (নরম / প্রতীকী) বিকল্প ব্যতীত আপনিln কমান্ডের সাহায্যে হার্ড লিঙ্কগুলি তৈরি করতে পারেন । যতক্ষণ না ফাইলের সামগ্রীতে কমপক্ষে একটি হার্ড লিঙ্ক উপস্থিত থাকে ততক্ষণ এটি ফাইল সিস্টেম দ্বারা পুনরায় ব্যবহার করা হবে না।-s

(পার্শ্ব নোট, অনুমতিগুলি সাধারণত ফাইলের সামগ্রীতে প্রয়োগ হয় ডিরেক্টরি ডিরেক্টরিতে প্রবেশের জন্য নয়। এ কারণেই কোনও সাধারণ ব্যবহারকারী কখনও কখনও নিজের মালিকানাধীন কোনও ফাইল মুছে ফেলতে পারেন rootতবে তাতে লিখতে পারেন না The মুছুন অপারেশনটি ফোল্ডারটি পরিবর্তন করে, ফাইলটি নিজেই পরিবর্তন করে না। )

কমপক্ষে একটি প্রক্রিয়াতে ফাইল খোলা থাকে না ততক্ষণ ফাইল সিস্টেমে ফাইল সামগ্রী পুনরায় ব্যবহার করা হবে না। এমনকি কোনও ডিরেক্টরি এন্ট্রি উপস্থিত না থাকলেও কোনও প্রক্রিয়া না খোলার আগে পর্যন্ত ফাইল সিস্টেমটি স্থানটিকে মুক্ত হিসাবে বিবেচনা করবে না। ফাইল উদ্ধার করা সম্ভব ভার্চুয়াল ফাইল সিস্টেম থেকে /proc/<pid>/fdদ্বারা rootযতদিন ফাইল হিসাবে খোলা থাকে। (ধন্যবাদ @ ফ্লুফিশিপ।)


1
যদি ফাইলটি খোলা থাকে এমন কোনও প্রক্রিয়া ঘটে থাকে তবে আপনি এটি / proc / <pid> / fd এ সন্ধান করে পুনরুদ্ধার করতে পারেন। দেখুন superuser.com/questions/283102/...
fluffysheap
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.