ফাইলের নামে বিশেষ অক্ষর সহ ফাইলগুলি মুছতে / সরানো যায় না


17

আপনি নীচে দেখতে পাচ্ছেন যে ফাইলগুলির মধ্যে অস্বাভাবিক অক্ষর রয়েছে।

ফাইল ম্যানেজার স্ক্রিনশট

টার্মিনাল বা ডলফিনে এগুলি মুছে ফেলা হলে ত্রুটিটি ফিরে আসে:

অনুরূপ কোন ফাইল বা ডিরেক্টরি নেই

ls -laডিরেক্টরি চালানো আমাকে এই আউটপুট দিয়েছে:

-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ?2?.???љ?!?Gb??σ?[?F?
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 3l??#g?w????O?JKB7?co??քH??bT?NA???S???X?I?A?qC??M?I???
-rw-rw-r--  1 aalap aalap      0 Nov 14 01:05 ??8??-?@,?Zp?[?bI????7^?ñ[?ڏ??z?O???ч??eEȰ?+??,OF??h

আমি fsckঅন্য ওএস থেকে বিভাজনে একটি কমান্ড চালিয়েছি তবে এটি কোনও পরিবর্তন করেনি।

আমি এই ফাইলগুলি কীভাবে সরিয়ে দেব?


1
আপনি কি একটি এনক্রিপ্ট করা হোম ডিরেক্টরি রাখতে আপনার সিস্টেম সেট আপ করেছেন?
dobey

@ ডোবি আমি না।
কর্জেদাভপাল

5
@ প্যান্থার আপনি ভুল হয়ে গেছেন এই না , নিজে, একটি দুর্নীতিগ্রস্ত ফাইল সিস্টেম একটি ইঙ্গিত, এবং এমনকি যদি এটা ছিল কিছু ধরনের তথ্য দূষণের, fsck এটি সম্পর্কে কিছু করতে হবে না।
zwol


1
আমার নামে অচেনা অক্ষরযুক্ত ফাইল রয়েছে। ফাইলগুলির নামকরণ কাজ করে। তাহলে সেগুলি মুছতে পারে।
রাভী

উত্তর:


35

একটি সহজ উপায় হ'ল এই ফাইলগুলি তাদের ইনোড দ্বারা সরানো। :)

ls -liপ্রতিটি ফাইলের ইনোড নম্বর দেখানোর জন্য অসাধারণ অক্ষরগুলি সহ ডিরেক্টরিতে ব্যবহার করুন, যেমন,

$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ?2?.???љ?!?Gb??σ?[?F?
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

এরপরে, নিম্নলিখিত উদাহরণটির মতো findবাক্য গঠন ব্যবহার করে, তার নামের সাথে সংশ্লিষ্ট ফাইলটি মুছতে ইউটিলিটিটি ব্যবহার করুন find <somepath> -inum <inode_number> -exec rm -i {} \;:

$ find . -inum 133370 -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
$ ls -li
total 0
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??

-iবিকল্প rmসত্যিই প্রয়োজনীয়, আমি শুধু ঘটনাক্রমে সরানোর আপনি যে ফাইলগুলি মুছে ফেলার জন্য বলিনি থেকে দূরে রাখার এটি যোগ নয়। :) এটি rmআপনাকে মুছতে চাইলে প্রতিটি ফাইলের নিশ্চয়তার জন্য জিজ্ঞাসা করে।

যদি আপনি একাধিক ফাইলগুলি তাদের ইনোডগুলি দ্বারা সরাতে চান তবে আপনি এর জন্য -o(অর্থ বা ) বাক্য গঠন ব্যবহার করতে পারেন find:

$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
rm: remove regular empty file ‘./?2?.???љ?!?Gb??σ?[?F?’? y
rm: remove regular empty file ‘./??3]d???:????????1????G?p?ȋ??????嫳?d????ą-??’? y

আপনি আরও -o -inum <inode_number>এক্সপ্রেশন দিয়ে প্রথম বন্ধনীতে এক্সপ্রেশন বাড়িয়ে আরও ইনোড নম্বর যুক্ত করতে পারেন ।


4
কীভাবে rm -ri .?
ব্রেন্ট ব্যাকালা

এটি কাজ করেছে: <সোমেপথ> -ইনুম <ইন কোড_নম্বার>-এক্সেক আরএম -i {} \; '-Inum', '{}', এবং '\' কমান্ডটিতে কী করে?
কর্জেডভপাল

আমি কীভাবে একসাথে একাধিক ফাইল সরিয়ে ফেলব? এছাড়াও, ধন্যবাদ, আপনি আমার দিন তৈরি!
কর্জেদাভপাল

2
@ ব্রেন্টব্যাকালা rm -ri .যদিও ইনড দ্বারা ফাইলগুলি মুছে ফেলছে না। এটি কেবলমাত্র পুরো ওয়ার্কিং ডিরেক্টরিটির মাধ্যমে পুনরাবৃত্তি করবে এবং আপনি যদি এটি মুছে ফেলতে চান তবে প্রতিটি ফাইলের জন্য জিজ্ঞাসা করবেন - এবং কোনও ফাইলটি যাতে দুর্ঘটনাক্রমে অযাচিত ফাইলগুলি না সরানোর জন্য আপনাকে জিজ্ঞাসা করা হয় সে সম্পর্কে আপনাকে খুব মনোযোগী হতে হবে। আমি অবশ্যই আমার হোম ডিরেক্টরিতে এই কমান্ডটি ব্যবহার করতে চাই না - এতে প্রচুর ফাইল রয়েছে। ;)
মাল্টে স্কোরুপা

3
@ কারজেদাভপালা (১) তাদের ইনোড নম্বর দিয়ে ফাইলগুলি সন্ধান করতে -inumবলে find। (২) {}খুঁজে পাওয়া ফাইল (গুলি) এর সাথে মেলে grep। (3) the ;প্রতীকটি পলায়ন করে যা -execঅপশনটিতে দেওয়া আদেশটি সমাপ্ত করে find। (৪) এক সাথে কীভাবে একাধিক ফাইল সরানো যায় তা বোঝাতে আমি আমার উত্তর সম্পাদনা করেছি।
মাল্টে স্কোরুপা

13

এটি বোঝা যে এই হল গুরুত্বপূর্ণ না "ফাইল সিস্টেম দুর্নীতি" যে ধরনের fsckসাহায্য করব। যতক্ষণ ফাইল সিস্টেম সম্পর্কিত, ফাইলের নামগুলি বাইটের যে কোনও অনুক্রম হতে পারে , যতক্ষণ না কোনও একক বাইটের মান 0x00 (ASCII NUL, সি-অফ-স্ট্রিং চিহ্নিতকারী) বা 0x2F (0x2F) না থাকে (/ , ডিরেক্টরি বিভাজক) থাকে না। (যদি কোনও ফাইলের নাম এতে কোনও 00 বা 2F বাইট এম্বেড করে থাকে তবে এটি fsckঠিক করা উচিত))

পরিবর্তে, আপনার কাছে ফাইলের নাম যা অ্যাপ্লিকেশন সফ্টওয়্যার (ডলফিন ls) মনে করে যে এমন অক্ষরগুলি রয়েছে যা আপনার " লোকালে " তে প্রদর্শনযোগ্য নয় , তাই এটি তাদের স্থানধারক অক্ষর দ্বারা প্রতিস্থাপন করছে। আপনি এই অক্ষরগুলিও টাইপ করতে পারবেন না , সুতরাং ফাইলগুলি ম্যানিপুলেট করা আরও শক্ত, তবে আপনি নামটি টাইপ করা বা অনুলিপি না করে বা পেস্ট না করে আপনি যতক্ষণ না এটি করতে পারবেন ততক্ষণ আপনি এটি করতে পারবেন। উদাহরণস্বরূপ, আপনি যদি ডলফিনের মধ্যে থেকে সমস্যা ফাইলগুলি সরাসরি মুছে ফেলেন বা নামকরণ করেন, তবে জাস্ট ওয়ার্ক হওয়া উচিত (আমি এতদূর যেতে চাই যে এটি কাজ না করে, এটি ডলফিনের একটি বাগ)।

আপনার যদি শেল থেকে তাদের সম্পর্কে কিছু করার প্রয়োজন হয় (উদাহরণস্বরূপ, যদি সেগুলি মালিকানাধীন থাকে) root জিইউআই প্রোগ্রামের এবং তাই এটি কোনও জিইউআই প্রোগ্রামের মাধ্যমে সংশোধন করা যায় না), আপনি তাদেরকে পরোক্ষভাবে "গ্লোব" নিদর্শন ব্যবহার করে নাম রাখতে পারেন, যা সঠিক ক্রমটিতে প্রসারিত হবে (গুলি) এর বাইট এবং পাশ দিয়ে গেছে।

এখন, অবশ্যই, আপনি দুর্ঘটনাক্রমে স্টাফ মুছতে চাইবেন না কারণ আপনার গ্লোব প্যাটার্নটি খুব বেশি মিলেছে, তাই আমার প্রস্তাবটি renameপ্রতিটি ফাইলের নামটিকে হেক্স এনকোডিংয়ে রূপান্তর করতে পার্ল ইউটিলিটিটি ব্যবহার করা হবে:

$ rename '$_ = unpack("H*", $_)' *

এটি কোনও তথ্যই নষ্ট করে না - ফাইলটি নিজেই নয়, অর্থাত্ যা অর্থ হতে পারে তা মংগল হওয়ার আগে ফাইলনেমে এনকোড করা হয়েছিল। উদাহরণস্বরূপ নির্দিষ্ট ফাইলগুলির জন্য এটি পূর্বাবস্থায় ফেরা যায়

$ rename '$_ = pack("H*", $_)' 696d706f7274616e742e646f63

সতর্কতা: দুটি renameউত্স নামে , বিভিন্ন উত্স থেকে; উপরের কমান্ডগুলি কেবল পার্ল থেকে উদ্ভূত একের সাথে কাজ করবে। উবুন্টুতে, আপনি যেটি চান সেটি হ'ল "পুনর্নামকরণ" প্যাকেজ থেকে, "ইউজার-লিনাক্স" প্যাকেজটি নয়। rename -hপার্থক্য করবে: এটি আপনি চান ...

$ rename -h
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# ...

... এই কি আপনি চান না ...

$ rename -h

Usage:
 rename [options] <expression> <replacement> <file>...
# ...

মূল বিষয়টি হ'ল "পার্লেক্সপ্রি" " পার্ল নামের পুনর্নবীকরণের পুরানো সংস্করণ থাকতে পারে যা উপরের সমস্ত বিকল্প বুঝতে পারে না, তবে আমি যে আদেশটি দেখিয়েছি তা এখনও কাজ করা উচিত।

সম্পাদনা করুন: 14.04 .5 এর নীচে অন্তর্ভুক্ত পার্ল স্ক্রিপ্ট rename-h সুইচ সমর্থন করে না। man renameশীর্ষস্থানটিতে কোন ক্ষেত্রে শীর্ষস্থান থাকবে তার ম্যান পৃষ্ঠাটি পরীক্ষা করে আপনি নিশ্চিত করতে পারেন যে আপনার সঠিক পৃষ্ঠাটি রয়েছে:

RENAME (1) পার্ল প্রোগ্রামারস রেফারেন্স গাইড RENAME (1)


পুনর্নবীকরণ - রূপান্তর অজানা বিকল্প: সংস্করণ
বয়স্ক গীক

@ এল্ডারগীক কী file $(which rename)মুদ্রণ করে? (নিশ্চিত করুন যে আপনার fileপ্যাকেজটি ইনস্টল করা আছে, প্রথমে))
zwol

/usr/bin/rename: symbolic link to /etc/alternatives/rename( fileডিফল্টরূপে ইনস্টল করা আছে) আসলে আপনাকে পেতে প্রতীকী লিঙ্কগুলি তাড়াতে হবে /usr/bin/file-rename: a /usr/bin/perl -w script, ASCII text executable তবে man renameএটি একটি দ্রুত ইঙ্গিত ...
বয়স্ক গীক

@ এল্ডারগীক যদি এটি পার্ল স্ক্রিপ্ট হয় তবে সম্ভবত এটি "পার্লের সাথে উদ্ভূত একটি" এর একটি পুরানো সংস্করণ, এটি সমর্থন করে না --version; আমার নির্দেশিত আদেশটি এখনও কাজ করা উচিত। (/usr/share/doc/rename/changelog.gz আমার কম্পিউটারে, যা ডিবিয়ান অস্থির চালিত হয়, এটি ইঙ্গিত করে যে --versionপার্ল নাম পরিবর্তনের ০.১০ সংস্করণে যুক্ত হয়েছিল, ২০১৩ সালে। আমি অবাক হয়েছি উবুন্টু এখনও এর চেয়েও পুরোনো কিছু পাঠাচ্ছেন, তবে এই প্রোগ্রামটি 2007 (!) থেকে
কার্যকরভাবে

আহ! এটি বিভ্রান্তির ব্যাখ্যা দেয়। বিপরীতে অনেক দাবি সত্ত্বেও, দেবিয়ান উবুন্টু নন। আমি প্রতিটি প্রকাশের জন্য কথা বলতে পারি না, তবে উবুন্টু এলটিএসের কয়েকটি সমর্থিত সংস্করণ (14.04) এখনও তা নেই that (যদিও 16.04 করেন)
বয়স্ক গীক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.