ট্র্যাসে `rm` সরান


54

এমন কোন লিনাক্স স্ক্রিপ্ট / অ্যাপ্লিকেশন রয়েছে যা ফাইলগুলি মুছে ফেলার পরিবর্তে এগুলিকে একটি বিশেষ "আবর্জনা" স্থানে নিয়ে যায়? আমি এটি একটি প্রতিস্থাপন হিসাবে চাই rm(সম্ভবত এমনকি আধুনিক aliasing; তার জন্য বিভিন্ন মতামত আছে)।

"ট্র্যাশ" বলতে আমি একটি বিশেষ ফোল্ডার বোঝায়। একটি একক mv $* ~/.trashপ্রথম পদক্ষেপ, তবে আদর্শগতভাবে এটি পুরানো ট্র্যাশযুক্ত ফাইলগুলি ওভাররাইট না করে একই নামের বেশ কয়েকটি ফাইল ট্র্যাশ করা পরিচালনা করা উচিত এবং একটি সাধারণ কমান্ড (এক ধরণের "পূর্বাবস্থায়") দিয়ে ফাইলগুলি তাদের মূল স্থানে পুনরুদ্ধার করার অনুমতি দেয় । তদ্ব্যতীত, পুনরায় বুট করার সময় আবর্জনা স্বয়ংক্রিয়ভাবে খালি হয়ে গেলে (বা অন্তহীন বৃদ্ধি রোধ করার জন্য অনুরূপ একটি প্রক্রিয়া) ভাল লাগবে '

এর জন্য আংশিক সমাধান বিদ্যমান, তবে বিশেষত "পুনরুদ্ধার" ক্রিয়াটি তুচ্ছ নয়। গ্রাফিকাল শেল থেকে ট্র্যাশ সিস্টেমে নির্ভর করে না এর জন্য কি এমন কোনও বিদ্যমান সমাধান রয়েছে?

(একদিকে যেমন, ঘন ঘন ব্যাকআপ এবং ভিসিএস ব্যবহার না করে এই পদ্ধতির ন্যায্যতা রয়েছে কিনা তা নিয়ে অবিরাম আলোচনা হয়েছে those যদিও এই আলোচনার একটি বক্তব্য রয়েছে, আমি বিশ্বাস করি আমার অনুরোধের এখনও একটি বিশেষ জায়গা আছে there's)


4
এটি ফাইলগুলি ট্র্যাশে স্থানান্তরিত করতে সুপার ব্যবহারকারীর প্রশ্ন দুটি কমান্ডের সাথে সম্পর্কিত হতে পারে পার্থক্য কি? । আমি gvfs-trashঅতীতে ব্যবহার করেছি , তবে আপনি আমার কৌতূহল বোধ না করা অবধি কমান্ড-লাইন থেকে পুনরুদ্ধার করার প্রয়োজন ছিল না। লিঙ্কযুক্ত প্রশ্নের উত্তর সহায়ক হতে পারে।
এফস্মিথ

1
@ আফস্মিথ ধন্যবাদ, ভাল লিঙ্ক। যদিও এই পদ্ধতির সাথে সমস্যাটি হ'ল তারা নির্দিষ্ট ডেস্কটপ শেলের (এখানে সঠিক শব্দটি কী?) প্রয়োগের সাথে আবদ্ধ, এমন কিছু যা আমি এড়াতে চাই।
কনরাড রুডল্ফ

1
কোনও ফাইল সিস্টেম থেকে আপনার ফাইলগুলি কী ইচ্ছাকৃতভাবে চালিত করা হচ্ছে? কারণ কোনও দিন আপনি সম্ভবত একটি রিমোট সার্ভার থেকে এসএসএফএস লাগানো একটি ডায়ারে থাকা 4 জিবি আইসো চিত্র মুছে ফেলছেন।
মিশা আরেফিয়েভ

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

3
আপনি যা চান যেমন করুন নীচের উত্তরে বর্ণিত সমাধানগুলির মতো করুন, তবে এটির নাম রাখবেন না । যেমনটি অন্যের নির্দেশিত, মানক কমান্ডগুলির নাম পরিবর্তন / পুনর্নির্ধারণের ফলে আপনি অন্য সিস্টেমগুলিতে অভ্যাসগতভাবে ব্যবহার করার চেষ্টা করলে আপনি দুর্বল হয়ে পড়েছেন, তবে অপ্রত্যাশিত ফলাফলগুলি উপস্থিত হওয়ার পরে এটি আপনার সিস্টেম / অ্যাকাউন্ট ব্যবহার করে অন্য কারও জন্য (সম্ভবত আপনাকে সহায়তা করা) সমস্যা সৃষ্টি করবে।
জো

উত্তর:


37

ফ্রিডেস্কটপ.অর্গ.এর ট্র্যাশে একটি স্পেসিফিকেশন (খসড়া) রয়েছে । স্পষ্টতই ডেস্কটপ পরিবেশ দ্বারা এটি প্রয়োগ করা হয়।

একটি কমান্ডলাইন বাস্তবায়ন ট্র্যাশ-ক্লিপ হবে । কাছাকাছি চেহারা না থাকলে মনে হচ্ছে আপনার পছন্দমতো ফাংশনালিটি সরবরাহ করা হবে। যদি তা না হয় তবে এটি কেবলমাত্র একটি আংশিক সমাধান tell

প্রতিস্থাপন / উপন্যাস হিসাবে কোনও প্রোগ্রাম ব্যবহার rmকরার ক্ষেত্রে, এটি না করার উপযুক্ত কারণ রয়েছে। আমার জন্য সবচেয়ে গুরুত্বপূর্ণ:

  • প্রোগ্রামটির সমস্ত rmঅপশন বুঝতে / পরিচালনা করতে হবে এবং সেই অনুসারে কাজ করতে হবে
  • এটি আপনার "নতুন আরএম" এর শব্দার্থবিজ্ঞানের সাথে অভ্যস্ত হওয়ার এবং অন্য মানুষের সিস্টেমে কাজ করার সময় মারাত্মক পরিণতি সহ কমান্ড সম্পাদন করার ঝুঁকি রয়েছে

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

আমি অভ্যাসটি অভ্যাসের অভ্যাসের সাথে আরএম জিনিসটি পাওয়ার বিষয়ে ভাবছি। দুর্ভাগ্যক্রমে আমি ইতিমধ্যে অভ্যাসে আছি।
কনরাড রুডল্ফ

@ জোফেল: লাইবট্রাশের একটি দুর্দান্ত ধারণা রয়েছে। অন্যান্য পদ্ধতির চেয়ে আরও কয়েকটি স্তর গভীর। এটি দুঃখজনক যে এটি বগী (এবং খুব সক্রিয় বলে মনে হয় না)।
zpea

4
@ কনরাডরুডল্ফ: আমি বোঝাতে চাইছিলাম যে, কেউ এই সত্যে অভ্যস্ত হয়ে যায় যে আরএম (প্রতিস্থাপিত) আসলেই কোনও কিছু মুছবে না, যাতে পুনরুদ্ধার করা সর্বদা সম্ভব বলে কোনও ব্যক্তি খুব কম সতর্ক হন। অবশ্যই, আরএম নিজেই ব্যবহার করা খারাপ জিনিস নয়, অভ্যস্তও হচ্ছে না।
zpea

4
আমি এই সমাধানটি ব্যবহার করে শেষ করেছি, এবং অক্ষম করছি rmযাতে আমি এটি দুর্ঘটনাক্রমে ব্যবহার করতে পারি না (এখনও /bin/rmসত্যিই আমার এটির প্রয়োজন হলে এমন কিছু আছে)।
কনরাড রুডলফ

9

ট্র্যাশ-ক্লাই একটি লিনাক্স অ্যাপ্লিকেশন যা উবুন্টু বা ফেডোরার ইয়াম-এ ব্যবহার করে ইনস্টল করা যেতে পারে। কমান্ডটি ব্যবহার করে trash listOfFilesনির্দিষ্ট করাটি আপনার ট্র্যাসবিনে সরানো হবে।



7

পূর্ববর্তী উত্তরগুলি কমান্ড উল্লেখ করে trash-cliএবং rmtrash। এগুলির কোনওটিই উবুন্টু 18.04-এ ডিফল্টরূপে পাওয়া যায় নি, তবে আদেশটি gio। কমান্ডিং gio help trashআউটপুট:

Usage:
  gio trash [OPTION…] [LOCATION...]

Move files or directories to the trash.

Options:
  -f, --force     Ignore nonexistent files, never prompt
  --empty         Empty the trash

আমি gio trash FILENAMEকমান্ড লাইনে ব্যবহার করে পরীক্ষা করেছি এবং এটি ঠিক ঠিক কাজ করেছে যেমন আমি ফাইল ব্রাউজারে ফাইলটি নির্বাচন করেছি এবং ডেল বোতামটি ক্লিক করেছি: ফাইলটি ডেস্কটপের ট্র্যাশ ফোল্ডারে সরানো হয়েছে। (কমান্ডটি আমি -fবিকল্পটি ব্যবহার না করেও নিশ্চিতকরণের জন্য অনুরোধ করব না ))

ফাইল মুছে ফেলার এই ভাবে যখন redefining চেয়ে আরও বেশি সুবিধাজনক হচ্ছে, উলটাকর rmহতে rm -iনিরাপত্তার জন্য এবং প্রতিটি মুছে ফেলার, যা এখনও আপনার ভাগ্য আউট ছেড়ে নিশ্চিত করতে যদি আপনি দূর্ঘটনাক্রমে একটি মুছে ফেলার আপনি থাকা উচিত নয় তা নিশ্চিত হচ্ছে।

আমি alias tt='gio trash'আমার ওরফে সংজ্ঞা ফাইলটিতে যুক্ত করেছি; ttটু ট্র্যাশের জন্য একটি স্মরণীয়।

2018-06-27 এ সম্পাদনাতে যুক্ত করা হয়েছে: সার্ভার মেশিনে, কোনও ট্র্যাশ ডিরেক্টরিের সমতুল্য নেই। আমি নিম্নলিখিত বাশ স্ক্রিপ্ট লিখেছি যা কাজ করে; ডেস্কটপ মেশিনে, এটি ব্যবহার করে gio trashএবং অন্যান্য মেশিনে, প্যারামিটার হিসাবে দেওয়া ফাইল (গুলি) এটি তৈরি করে এমন একটি ট্র্যাস ডিরেক্টরিতে সরানো হয়। স্ক্রিপ্ট 2019-09-05 এ আপডেট হয়েছে।

#!/bin/bash
#
# move-to-trash
#
# Teemu Leisti 2019-09-05
#
# This script moves the files given as arguments to the trash directory, if they
# are not already there. It works both on (Gnome) desktop and server hosts.
#
# The script is intended as a command-line equivalent of deleting a file from a
# graphical file manager, which, in the usual case, moves the deleted file(s) to
# a built-in trash directory. On server hosts, the analogy is not perfect, as
# the script does not offer the functionality of restoring a trashed file to its
# original location, nor that of emptying the trash directory; rather, it offers
# an alternative to the 'rm' command, giving the user the peace of mind that
# they can still undo an unintended deletion before emptying the trash
# directory.
#
# To determine whether it's running on a desktop host, the script tests for the
# existence of the gio utility and of directory ~/.local/share/Trash. In case
# both exist, the script relies on the 'gio trash' command. Otherwise, it treats
# the host as a server.
#
# There is no built-in trash directory on server hosts, so the first invocation
# of the script creates directory ~/.Trash/, unless it already exists.
#
# The script appends a millisecond-resolution time stamp to all the files it
# moves to the trash directory, both to inform the user of the time of the
# deletion, and to avoid overwrites when moving a file to trash.
#
# The script will not choke on a nonexistent file. It outputs the final
# disposition of each argument: does not exist, was already in trash, or was
# moved to trash.


gio_command_exists=0
command -v gio > /dev/null 2>&1
if (( $? == 0 )) ; then
    gio_command_exists=1
fi

# Exit on using an uninitialized variable, and on a command returning an error.
# (The latter setting necessitates appending " || true" to those arithmetic
# calculations and other commands that can return 0, lest the shell interpret
# the result as signalling an error.)
set -eu

is_desktop=0

if [[ -d ~/.local/share/Trash ]] && (( gio_command_exists == 1 )) ; then
    is_desktop=1
    trash_dir_abspath=$(realpath ~/.local/share/Trash)
else
    trash_dir_abspath=$(realpath ~/.Trash)
    if [[ -e $trash_dir_abspath ]] ; then
        if [[ ! -d $trash_dir_abspath ]] ; then
            echo "The file $trash_dir_abspath exists, but is not a directory. Exiting."
            exit 1
        fi
    else
        mkdir $trash_dir_abspath
        echo "Created directory $trash_dir_abspath"
    fi
fi

for file in "$@" ; do
    file_abspath=$(realpath -- "$file")
    file_basename=$(basename -- "$file_abspath")
    if [[ ! -e $file_abspath ]] ; then
        echo "does not exist:   $file_abspath"
    elif [[ "$file_abspath" == "$trash_dir_abspath"* ]] ; then
        echo "already in trash: $file_abspath"
    else
        if (( is_desktop == 1 )) ; then
            gio trash "$file_abspath" || true
        else
            # The name of the moved file shall be the original name plus a
            # millisecond-resolution timestamp.
            move_to_abspath="$trash_dir_abspath/$file_basename-$(date '+%Y-%m-%d-at-%H-%M-%S.%3N')"
            while [[ -e "$move_to_abspath" ]] ; do
                # Generate a new name with a new timestamp, as the previously
                # generated one denoted an existing file.
                move_to_abspath="$trash_dir_abspath/$file_basename-$(date '+%Y-%m-%d-at-%H-%M-%S.%3N')"
            done
            # We're now almost certain that the file denoted by name
            # $move_to_abspath does not exist, as for that to be the case, an
            # extremely unlikely run condition would have had to take place:
            # some other process would have had to create a file with the name
            # $move_to_abspath after the execution of the existence test above.
            # However, to make absolute sure that moving the file to the trash
            # directory will always be successful, we shall give the '-f'
            # (force) flag to the 'mv' command.
            /bin/mv -f "$file_abspath" "$move_to_abspath"
        fi
        echo "moved to trash:   $file_abspath"
    fi
done

5

আরএমট্রাশ নামে একটি সামান্য ইউটিলিটি রয়েছে যা এটি করে।

এটা তোলে প্যারাম সাড়া মত মনে হচ্ছে না -rবা -f(এটা মূলত শুধু / ডিরেক্টরি ~ / .Trash ডিরেক্টরির ফাইল চলন্ত করছে বলে মনে হচ্ছে), কিন্তু এটা একই নামের ফাইল ওভাররাইড করা হবে না (এটা "কপি করো" appends করতে নামযুক্ত ফাইল / ডিরেক্টরি)।

মিশ্রণ সঙ্গে ইনস্টল করতে

brew install rmtrash
alias rm='rmtrash' >> ~/.bashrc

github.com/nateshmbhat/rm-trash । "আরএম-ট্র্যাশ", নকল ফাইলের নাম এবং পুনরাবৃত্ত মোছার কাজগুলি পরিচালনা করে। এটা দেখ.
নাটেশ ভাট

4

এখানে একটি দ্রুত এবং নোংরা ট্র্যাশ সিস্টেম রয়েছে যা নাম সংঘর্ষের সাথে কপি করে এবং এমনকি প্রতি সেকেন্ডে একাধিক ফাইল মুছতে না পারলে একই পথে একাধিক মুছে ফেলা ফাইলগুলিকে মঞ্জুরি দেয়।

সতর্কতা: আমি সরাসরি আমার ব্রাউজারে এই কোডটি টাইপ করেছি। এটি সম্ভবত ভেঙে গেছে। উত্পাদন ডেটা এ ব্যবহার করবেন না।

trash_root=~/.trash
mkdir "$trash_root"
newline='
'
trash () (
  time=$(date +%Y%m%d%H%M%S)
  for path; do
    case $path in /*) :;; *) path=$PWD/$path;; esac
    mkdir "$trash_root${path%/*}"
    case ${path##*/} in
      ?*.*) ext="${path##*.}"; ext="${ext##*$newline}";;
      *) ext="";;
    esac
    metadata="Data: $hash.$ext
Date: $time
Path: $path
"
    hash=$(printf %s "$metadata" | sha1sum)
    printf %s "$metadata" "$trash_root/$hash-$time-metadata"
    mv "$path" "$trash_root/$hash.$ext"
  done
)

untrash () (
  IFS='
  '
  root=$PWD
  cd "$trash_root" || return 2
  err=0
  for path; do
    if [ -e "$path" ]; then
      echo 1>&2 "Not even attempting to untrash $path over an existing file"
      if [ $err -gt 2 ]; then err=2; fi
      continue
    fi
    case $path in /*) :;; *) path=$root/$path;; esac 
    if metadata=$(grep -l -F -x "Path: $path" *-metadata |
                  sort -t - -k 2 | tail -n 1); then
      mv "${metadata%%-*}".* "$path"
    else
      echo 1>&2 "$path: no such deleted file"
      if [ $err -gt 1 ]; then err=1; fi
    fi
  done
  return $err
)

জ্ঞাত সমস্যা:

  • আপনি একই ফাইলটি একই সাথে বেশ কয়েকবার মুছে ফেলার চেষ্টা করলে কৌতূহল সহ্য করে না।
  • ট্র্যাশ ডিরেক্টরিটি বিশাল আকার ধারণ করতে পারে, হ্যাশের প্রথম কয়েকটি সংখ্যার ভিত্তিতে ফাইলগুলি উপ-ডিরেক্টরিতে প্রেরণ করা উচিত।
  • trashফাইলের নামগুলিতে নিউলাইনগুলি মোকাবেলা করা উচিত, তবে untrashতা নয় কারণ এটি নির্ভর করে grepএবং মেটাডেটা ফাইলটিতে নিউলাইনগুলি এড়ায় না।

2

একটি move_to_trashফাংশন সংজ্ঞা দিয়ে শুরু করুন :

move_to_trash () {
    mv "$@" ~/.trash
}

তারপরে তার নাম rm:

alias rm='move_to_trash'

আপনি সর্বদা পুরাতন কল করতে পারেন rmএকটি ব্যাকস্ল্যাশ সঙ্গে এটি পলায়নের, ভালো দ্বারা: \rm

আমি জানি না কীভাবে পুনরায় বুটে ট্র্যাশ ডিরেক্টরিটি ফাঁকা রাখতে হবে (আপনার সিস্টেমের উপর নির্ভর করে আপনাকে rc*স্ক্রিপ্টগুলি দেখতে হবে) তবে cronসময়কালে ডিরেক্টরিটি ফাঁকা করে এমন কোনও কাজ তৈরি করাও সার্থক হতে পারে ।


2
দুর্ভাগ্যক্রমে, এটি ছিল সহজ অংশ…: /
কনরাড রুডলফ

এই স্ক্রিপ্টটি প্রতিটি ফাইলের জন্য একটি লুকানো ডিরেক্টরিতে একটি পাঠ্য ফাইল তৈরি করতে পারে যার মধ্যে এটি ছিল ডিরেক্টরিটি রয়েছে A
এফস্মিথ

এটি একই নামে একাধিক মুছে ফেলা ফাইলগুলির ট্র্যাশ ডিরেক্টরিতে সংঘটিত হওয়ার ঝুঁকি রয়েছে এবং কেবল সর্বশেষ "মুছে ফেলা" পুনরুদ্ধার করতে সক্ষম হবে।
হত্যাকারী

@ কিলারমিস্ট, হ্যাঁ মুভ কমান্ড দিয়ে অবশ্যই একটি অতিরিক্ত কিছু করা দরকার। আপনি যা চান "ট্র্যাশেড" ফাইলটির নাম দিন এবং আসল পথটি রাখুন: | এই সমস্ত চিৎকার করে "চাকাটি কেন পুনরায় তৈরি করুন"। এই সমস্যার বিদ্যমান সমাধান রয়েছে।
এফস্মিথ

এছাড়াও, একটি পৃথক উপনাম নাম ব্যবহার করুন। আপনার এলিয়াস ছাড়াই অন্য একটি মেশিনে কাজ করুন rm, আপনার ফাইলগুলিতে একটি ফোন করুন এবং সেখানে যান। delএকটি ভাল পছন্দ হতে পারে।
গ্লেন জ্যাকম্যান

1

আপনি আমার ডেল ব্যবহার করতে পারেন:

http://fex.belwue.de/fstools/del.html

ডেল ফাইলগুলি একটি .del / উপ-ডিরেক্টরিতে (এবং পিছনে) সরিয়ে দেয়

ব্যবহার: ডেল [-v] [-u] ফাইল (গুলি)
       দেল [-v] -p [-r] [-দিন দিন] [ডিরেক্টরি]
       দেল [-v] -l
বিকল্পগুলি: -v ভার্বোস মোড
         - আপনি মুছে ফেলা ফাইল (গুলি)
         -p শুদ্ধ ফাইলগুলি [-d দিনের চেয়ে পুরানো]
         -আর পুনরুক্ত (সমস্ত উপ-ডিরেক্টরি)
         -l তালিকা মুছে ফেলা ফাইল
উদাহরণ: ডেল * .টিএমপি # সমস্ত * .tmp ফাইল মুছুন
          del -u প্রকল্প.pl # মুছে ফেলা প্রকল্প.পিএল
          del -vprd 2 # ভার্জোজ শুদ্ধ 2 দিনের বেশি পুরানো ফাইলগুলি মুছে ফেলা হয়েছে

0

কে.ডি. 4.14.8 এ আমি ফাইলগুলি ট্র্যাশে স্থানান্তর করতে নিম্নলিখিত কমান্ডটি ব্যবহার করেছি (যেন এটি ডলফিনে সরানো হয়েছিল):

kioclient move path_to_file_or_directory_to_be_removed trash:/

প্রথম পরিশিষ্ট: আমি কমান্ডটি সহ পেয়েছি

    ktrash --help
...
    Note: to move files to the trash, do not use ktrash, but "kioclient move 'url' trash:/"

পরিশিষ্ট দ্বিতীয়: ফাংশন (তারপরে এটি আপনার .bashrc এ উত্স করুন)

function Rm {
    if [[ "$1" == '--help' ]] ; then
        echo 'USAGE:'
        echo 'Rm --help # - show help'
        echo 'Rm file1 file2 file3 ...'
        echo 'Works for files and directories'
        return
    fi
    for i in "$@" ;
    do
        kioclient move $i trash:/ && echo "$i was trashed"
    done
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.