Як перемістити файли у смітник з командного рядка?


129

Я багато займаюся терміналом, і сьогодні мав досвід набору тексту

rm fileInQuestion.txt

Перш ніж дізнатися, що мені насправді потрібен fileInQuestion.txt. Якби я видалив у графічному інтерфейсі, я б тільки що дістав його з кошика. Мені хотілося б знати, чи можна перевантажити 'rm' у Терміналі таким чином, що він відправляє файл / файли у Кошик на виході.


1
Є програми, які можуть відновити видалені файли (до тих пір, поки ці сектори на жорсткому диску не будуть перезаписані в середній час!). Коли це станеться, вам слід скористатись одним із таких ...
iconoclast

Також дивіться askubuntu.com/q/468721/250556 щодо Google, які шукають пошук файлів ubuntu / debian / linux.
ThorSummoner

Відповіді:


100

Я б не радив ступенчатость , rmщоб , mvяк ви могли б отримати в звичку rmпостійно не видаляючи файли , а потім зіткнутися з проблемами на інших комп'ютерах або в рамках інших облікових записів користувачів , коли він робить постійно видаляти.

Я написав набір bashскриптів , які додають більше Mac OS X інструменти типу командного рядка (на додаток до ряду вбудованих в них , як open, pbcopy, pbpasteі т.д.), що найголовніше trash. Моя версія trashбуде робити всі правильні речі, які згладжування rmне буде (і, сподіваємось, нічого поганого, але я використовую його на своїх власних Macs уже кілька років без втрачених даних), включаючи: перейменування файлу, як Finder якщо файл з такою ж назвою вже існує, розміщуючи файли у правильній папці Кошик на зовнішніх томах; У нього також є деякі додаткові приємності, як-от: він намагається використовувати AppleScript, коли він доступний, щоб ви отримали приємний звук сміття та таке (але цього не потрібно, щоб ви все одно могли використовувати його через SSH, коли жоден користувач не входить у систему), він може надають розмір кошика для всіх томів.

Ви можете захопити мій набір інструментів-osx з мого сайту або останню і найбільшу версію зі сховища GitHub .

Там також команда , розроблена Алі Rantakari , але я не перевіряв , що один сам.trash


4
Відмінна відповідь, набагато краще, ніж моя!
користувач1256923

24
Я використовую trashРантакарі досить довгий час і справді можу поручитися за це. Він складений Objective-C і вміло використовує стандартні API файлової системи, і якщо він не працює (тобто користувач не має достатніх прав), він закликає Finder викинути файли (ефективно вимагає аутентифікації). Ви можете прочитати більше інформації trashз hasseg.org/blog .
Ярі Кейненен

26
сміття також доступне через диспетчер пакетів заварювання. просто використовувати: brew install trash.
Ландон Кун

8
@ landon9720 Добре. І, щоб уточнити для інших, trashкоманда, доступна через Homebrew, - це Алай Рантакарі (див. brewФормулу ).
моргантний

3
Я зміг виправити помилку, запустивши, brew remove trashа потім brew install trash.
Еліас Замарія

99

Інструмент командного рядка сміття можна встановити через brew install trash.

Це дозволяє відновити пошкоджені файли за допомогою командного рядка або Finder.


2
Яке елегантне рішення!
Містер Пей

6
Також доступні в макпортах:port install trash
holocronweaver

кожного разу, коли я намагаюся brew install trash, отримую це: pastebin.com/N92cM7d8
Ben Leggiero

@ BenC.R.Leggiero Я б переніс цю проблему на github.com/ali-rantakari/trash/isissue . Ви brew updateспочатку? Добре працює в моєму кінці.
Пол Венцель

@PaulWenzel так, і, здається, оновлення просто чудово. Я опублікую випуск.
Ben Leggiero

21

У мене є виконавчий файл, який називається remдесь у мене, $PATHіз наступним вмістом:

EDIT: код нижче - це переглянута та вдосконалена версія у співпраці з Дейвом Абрахамсом :

#!/usr/bin/env python
import os
import sys
import subprocess

if len(sys.argv) > 1:
    files = []
    for arg in sys.argv[1:]:
        if os.path.exists(arg):
            p = os.path.abspath(arg).replace('\\', '\\\\').replace('"', '\\"')
            files.append('the POSIX file "' + p + '"')
        else:
            sys.stderr.write(
                "%s: %s: No such file or directory\n" % (sys.argv[0], arg))
    if len(files) > 0:
        cmd = ['osascript', '-e',
               'tell app "Finder" to move {' + ', '.join(files) + '} to trash']
        r = subprocess.call(cmd, stdout=open(os.devnull, 'w'))
        sys.exit(r if len(files) == len(sys.argv[1:]) else 1)
else:
    sys.stderr.write(
        'usage: %s file(s)\n'
        '       move file(s) to Trash\n' % os.path.basename(sys.argv[0]))
    sys.exit(64) # matches what rm does on my system

Він поводиться точно так само, як і видалення з Finder. (Дивіться повідомлення в блозі тут .)


4
Це повинно мати більше балів ІМО. Оскільки саме AppleScript він використовує власне процес сміття, щоб перемістити файл у смітник, а це означає, що він буде вести себе точно так само. Однак сорому однолінійки не надавали.
mxcl

2
Ця відповідь є об’єктивним уроком, як правильно робити речі. Він працює з символами з оболонками і працює через Finder. Він не винаходить жодних коліс, і це настільки ж просто, як це може бути. Я помістив її в свою ~/bin, назвав її trash, і вона спрацювала вперше - це дозволило мені смітити всю кількість файлів набагато ефективніше, ніж якби мені довелося клацати на них у вікнах Finder. Велика подяка. Сподіваюся, ви опублікуєте більше відповідей!
Бен Ковіц

3
Ця версія обробляє цитати. Це дещо змінює поведінку при роботі з помилками, що у версії вище, здається, не дуже ретельно відпрацьована (помилки в stdout замість stderr, відсутній код виходу), але помилка, яку ви отримуєте, osascriptколи файл не існує не красиво, тож ви можете налаштувати цю частину.
Дейв Абрахамс

3
Хороша робота. Ця версія включає ці зміни, а також (1) намагається максимально імітувати команду оболонки rmз точки зору відображення повідомлень, коли файлів не існує, і (2) об'єднує все в один osascriptвиклик.
Ентоні Сміт


4

Я знайшов досить приємний код, який можна додати в кінці пакетного профілю користувача і викликає rmпереміщення файлів у кошик кожного разу, коли він запускається.

nano ~ / .bash_profile

#... append at the end
function rm () {
  local path
  for path in "$@"; do
    # ignore any arguments
    if [[ "$path" = -* ]]; then :
    else
      # remove trailing slash
      local mindtrailingslash=${path%/}
      # remove preceding directory path
      local dst=${mindtrailingslash##*/}
      # append the time if necessary
      while [ -e ~/.Trash/"$dst" ]; do
        dst="`expr "$dst" : '\(.*\)\.[^.]*'` `date +%H-%M-%S`.`expr "$dst" : '.*\.\([^.]*\)'`"
      done
      mv "$path" ~/.Trash/"$dst"
    fi
  done
}

джерело: http://hints.macworld.com/article.php?story=20080224175659423


2
Це v розумно, але я все одно не рекомендував би цього. Це розумно, тому що його в баш-профілі для користувача, і тому лише користувач може виконати цю версію функції, ввівши її, сценарії, які покладаються на rm, все одно будуть викликати оригінал. Але я б не рекомендував робити це, оскільки користувач звикне до того, що rm діятиме таким чином, коли цього немає на інших машинах. Я буду використовувати це, але перейменую функцію "сміття"
Метт Паркінс,

Я використовую ту саму функцію з двома змінами: ① Я виправив помилку у функції, яка спричиняє перейменування будь-якої папки на часову позначку, якщо вона була заповнена на вкладці, щоб включати косу рису: Для цього потрібні наступні зміни: Заміна лінія local dst=${path##*/}з local dst=${mindtrailingslash##*/}і вставивши іншу лінію як раз перед тим, який говорить local mindtrailingslash=${path%/}. ② Я використовую ім’я function rr. Як це, це не заважає простому rm, але ім'я настільки ж коротке і швидке набрати (будь-яке інше ім’я).
Мак

Змінити ім'я rm()на rmt()- Таким чином, ви все одно можете використовувати rmкоманду, коли захочете. Я думаю про rmt у голові як remove to trash: D
James111

4

Використовуйте команду термінала osascript, інтерпретатор AppleScript.

osascript -e "tell application \"Finder\" to delete POSIX file \"${PWD}/${InputFile}\""

Це повідомляє AppleScript сказати Finder відправити файл у кошик.

PWD потрібен для відносних шляхів до файлів, оскільки AppleScript не дуже добре справляється з цим.


1
Простий, ефективний і не потрібно нічого встановлювати! Приємно.
SilverWolf

2

сучасний підхід із застосуванням швидкого

https://github.com/reklis/recycle

//
// main.swift
// recycle
//
// usage: recycle <files or directories to throw out>
//

import Foundation
import AppKit

var args = NSProcessInfo.processInfo().arguments
args.removeAtIndex(0) // first item in list is the program itself

var w = NSWorkspace.sharedWorkspace()
var fm = NSFileManager.defaultManager()

for arg in args {
    let path = arg.stringByStandardizingPath;
    let file = path.lastPathComponent
    let source = path.stringByDeletingLastPathComponent

    w.performFileOperation(NSWorkspaceRecycleOperation,
        source:source,
        destination: "",
        files: [file],
        tag: nil)
}

1
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
jherran

@jherran дякую за нагадування, я додав сегмент коду
slf

Це моя найкраща відповідь, оскільки вона використовує ту саму логіку та API, що й інтерфейс інтерфейсу.
Джейсон Р. Кумбс

1
Тепер якби тільки була версія Python, яка уникала необхідності в двійковій системі 3 Мб для здійснення одного системного виклику.
Джейсон Р. Кумбс

1

Хоча можна rmперенести файли в кошик замість того, щоб видаляти їх, я б радив не приводити мислення в безпечну мережу графічних інтерфейсів користувачів до оболонки UNIX. Існує багато способів зробити серйозну шкоду за допомогою терміналу. Найкраще порадити IMHO - просто подумати двічі, перш ніж натиснути enterключ у вікно оболонки.

Якщо ви хочете rmнагадати, що ви збираєтесь видалити файл, розгляньте можливість використання наступного псевдоніма (для /bin/bashвведення цього рядка у .bashrcдомашній каталог):

alias rm "rm -i"

Це дозволить rmпідтвердити запит перед спробою видалити кожен файл.

Якщо у вас працює TimeMachine (я сподіваюся!), Ви завжди можете отримати свій файл із резервної копії. Таким чином ви можете втратити не більше однієї години роботи. Що, звичайно, погано. Тому подумайте ще раз, перш ніж натиснути цю enterклавішу!


1
Не робіть цього! Сценарії інсталятора можуть використовувати rmта вішати псевдонім rm -i.
Старий Про

3
@OldPro: .bashrcвиконується лише якщо інтерактивна оболонка. Перевірте сторінку чоловіка !
Маккі Мессер

Я б радив не знімати захисні мережі або наказувати цим робити інших.
the0ther

Я піду проти насайдерів і скажу, що цей трюк використовую для найкращого ефекту, але це, безумовно, слід робити лише знаючи про підводні камені. Два не згаданих - це те, що він тренує ваш мозок, який rmє безпечнішим, ніж це, що спричинить ваші проблеми в інших системах. Також, якщо ви використовуєте -f, -iце повністю ігнорується. Однак це хороша сітка безпеки. Краще - ніколи не використовувати rmна користь rmiпсевдоніма ( alias rmi="rm -i") або відмінної trashутиліти. Також додам, що до цього часу всі повинні були поставити [ -f ~/.bashrc ] && source ~/.bashrcсвої .bash_profile.
mattmc3

1

Є два утиліти, які можна встановити через Homebrew, які можуть досягти цього:

  1. сміття

    Це невелика програма командного рядка для OS X, яка переміщує файли чи папки у кошик. USP цієї команди дозволяє легко відновити файли. Команда для сміття файлів / папок не є корисною, якщо ви не зможете відновити файли / папки після їх перенесення. З веб-сайту команди:

За замовчуванням кошик просить Finder перемістити вказані файли / папки в кошик замість того, щоб викликати системний API для цього через функцію "put back", яка працює лише під час перегляду файлів через Finder.


-F

Попросіть Finder перемістити файли в кошик, а не використовувати системний API. Це повільніше, але він використовує користувальницький інтерфейс Finder (наприклад, звуки) та забезпечує функцію "поставити назад".

Список елементів, які зараз перебувають у кошику. Якщо цей аргумент використовується, жодних файлів не потрібно вказувати.

Очистіть кошик. сміття запитує підтвердження перед виконанням цієї дії. Якщо цей аргумент використовується, жодних файлів не потрібно вказувати.

Щоб встановити, trashзапустіть у Terminal наступне:

brew install trash.


  1. шум

    Інструмент командного рядка, який переміщує файли у кошик. На сторінці команди команди:

Ця команда переміщує файли у кошик, а не видаляє їх повністю з файлової системи. Дуже корисно, якщо ви вирішите, що ви хочете, щоб цей файл все-таки ...


-u USERNAME

необов'язковий аргумент. Це перемістить файл у кошик вказаного користувача. Зауважте, що для цього вам потрібно достатньо привілеїв.

Щоб встановити, rmtrashзапустіть у Terminal наступне:

brew install rmtrash.


1

Ось досить тривіальне однолінійне рішення, яке потрібно додати до вашого баш-профілю. Зауважте, що воно вже замінить щось із тим самим іменем у кошику.

trash() { mv -fv "$@" ~/.Trash/ ; }

Використання:

 ~/Desktop $$$ touch a b c
 ~/Desktop $$$ ls
a b c
 ~/Desktop $$$ trash a b c
a -> /Users/ryan.tuck/.Trash/a
b -> /Users/ryan.tuck/.Trash/b
c -> /Users/ryan.tuck/.Trash/c
 ~/Desktop $$$ ls
 ~/Desktop $$$

редагували відповідно - дякую за вклад!
Райан Тук

0

Правильно громлячи матеріал (так що це, безумовно , видобувні) набагато складніше , ніж просто mvдо ~/.Trash.

osx-trash може бути те, що ви шукаєте. ( Caveat emptor - я цього не пробував і не можу поручити, наскільки це безпечно.)


0

Перевірте trash-cli. Він працює між платформою, без сміття і підтримує функцію Put Back.

Ви можете встановити його за допомогою (вимагає Node.js ) :

$ npm install --global trash-cli

Крім того, якщо ви не хочете використовувати Node.js, ви можете встановити власний бінарний файл osx-trashвручну.


-1

У своєму .bashrc (або там, де ви зберігаєте параметри для своєї оболонки), спробуйте додати псевдонім, який змінює поведінку rm для переміщення матеріалів до ~ / .Trash, як у:

alias rm='move/to/.Trash'

Цей псевдонім, якщо далеко не банальний для впровадження (принаймні для мене), хоча використання mv (головного кандидата, який потрібно використовувати для цієї роботи)

mv file where

тому псевдонім, який ставить частину "куди" перед файлом для переміщення, може бути досить схематичним. Я розглядаю це, можливо, отримаю більш суттєву пораду.

EDIT: Я просто спробував додати наступне у свій .bashrc, і це працює:

function trash { mv "$@" ~/.Trash ; }

Це набагато примітивніше, ніж інші пропозиції, але ви уникаєте встановлення нових матеріалів.


3
Здавання rmбудь-чого небезпечне, оскільки це може зламати сценарії інсталятора. Я дізнався про це на власному гіркому досвіді , коли я псевдонімами , rmщоб rm -iі мав Встановлення повісити.
Старий Про

@ Старий Pro, це псевдонім, який я використовую для rm на всіх своїх комп’ютерах, починаючи з дня 0, і в мене ніколи не виникало проблем через це. Хочете навести приклад?
користувач1256923

3
@OldPro: .bashrcвикористовується лише для інтерактивних оболонок. Якщо ви запустили ./install.shновий процес, запускається і псевдонім не буде активним. Однак, якщо ви запустите . install.shваш поточний процес, він виконає інсталятор, і псевдонім активний. RTFM ...
Макі Мессер

3
Тоді інсталятор запустив інтерактивну оболонку і тому був серйозно зламаний. Один зламаний інсталятор навряд чи є достатньою підставою порадитись проти псевдонімів оболонки взагалі. YMMV
Маккі Мессер

1
Тим НЕ менше, це хороший рада , щоб не псевдонім rmкоманди, як сказав morgant, тому що ви освоїте rmпрактично не видаляючи файли , а потім може випадково видалити що - то в системі , де не було додано жодної такої псевдонім. Крім того, перемістити файл у кошик не так просто, як просто mv {} ~/.Trash. Якщо файл знаходиться в окремому томі, наприклад, це скопіює файл у домашній каталог та видалить оригінал.
Джош

-1

Я просто поставив цей сценарій

#!/bin/bash
application=$(basename "$0")
if [ "$#" == 0 ]; then
    echo "Usage: $application path [paths...]"
    exit 1
fi
trashdir="/Users/${USER}/.Trash"
while (( "$#" )); do
    if [ -e "$1" ]; then
        src=$(basename "$1")
        dst=$src
        while [ -e "$trashdir/$dst" ]; do
            dst=$src+`date +%H-%M-%S`
        done
        mv -f "$1" "$trashdir/$dst"
    else
        echo "$1" does not exist.
    fi
    shift
done

в ~/bin/trash, зробив це виправданим chmod +x ~/bin/trashі додав наступний рядок до~/.bash_profile

PATH=$PATH:$HOME/bin

Тоді можна використовувати його як

$ trash broken.js olddir cleanup.*

-2

Проста функція може дати вам сміттєві файли, перемістивши їх у папку .Trash користувача:

trash() {
   mv $1 ~/.Trash
}

? чому негативний голос? це була б і моя думка ..
CousinCocaine

Напевно, вам потрібно $*замість цього $1, але тоді ви закінчитеся з тією ж відповіддю, що і mv "$@" ~/.Trash. Чому люди голосують негативно, перевірте коментарі з іншої відповіді.
kenorb

Будьте обережні з цим псевдонімом; це працює, якщо у вас є лише один розділ або диск. Якщо ви працюєте над другою томою або загальною мережею, це фактично скопіює файл у кошик домашнього каталогу, що, мабуть, не те, що ви хотіли зробити!
jmk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.