Создание псевдонима для корзины

1819
phenomenon

Я новичок. Я установил псевдоним в файле .bashrc следующим образом.

alias myrm='mv /home/user/Trash/*' 

Цель состоит в том, чтобы при использовании комментария myrm, например, $ myrm foo, файл «foo» необходимо было переместить в папку «Корзина», которая находится в моей домашней папке (/ home / user / Trash).

Тогда я сделал

$source ~/.bashrc 

После этого, когда я пытаюсь использовать myrm, набрав $ myrm foo, я получаю следующее сообщение об ошибке.

mv: невозможно указать '/ home / user / Trash / *': такого файла или каталога нет

Как решить эту проблему?

7
Синтаксис `mv SOURCE DESTINATION`, а не` mv DESTINATION SOURCE`. Смотрите "man mv" и "help alias". Используйте функцию. Смотрите "справочная функция". Cyrus 7 лет назад 2
Исследуйте [позиционные параметры] (https://www.gnu.org/software/bash/manual/html_node/Positional-Parameters.html#Positional-Parameters). Ваш скрипт хочет, чтобы между $ mv и папкой назначения было $ 1, чтобы взять 'foo', который вы указали при запуске скрипта. mcalex 7 лет назад 0
Обходной путь: `alias myrm = 'mv -t / home / user / Trash'` Cyrus 7 лет назад 7
@Cyrus Это не обходной путь, это * правильный путь *. Kamil Maciorowski 7 лет назад 1
Спасибо @Cyrus и другим за комментарии. Псевдоним myrm = 'mv -t / home / user / Trash /} решил проблему. phenomenon 7 лет назад 0
Переход к ~ / Trash не позволит вам восстановить файл с помощью настольных приложений. Смотрите решение @ deshmukh, как не изобретать велосипед. xenoid 7 лет назад 0

6 ответов на вопрос

17
G-Man

Прежде всего, вы не используете, $когда вы называете псевдоним.  $предназначен для расширения переменной (и нескольких других вещей, которые не имеют особого отношения к этому вопросу).

Но, во-вторых, псевдонимы работают немного как переменные, в том смысле, что они (рискуя немного упростить) просто расширяются до нескольких слов. Вы говорите, что хотите сделать myrm foo, но это расширится до mv /home/user/Trash/* foo, что не имеет смысла.

Простым решением было бы определить псевдоним mv -t /home/user/Trash, который будет работать, потому что mvподдерживает

Файл mv -t destination_dir
синтаксис как альтернатива

mv filedestination_dir
синтаксис.

Но вы можете получить большую гибкость с помощью функции оболочки. Они сочетают гибкость сценариев с (низкими) издержками псевдонимов. Например,

myrm() { mv "$@" /home/user/Trash; } 

будет myrm fooинтерпретироваться как mv foo /home/user/Trash.

Я думаю, что `$` происходит из его оболочки, обычно все строки в терминале начинаются с `$`, чтобы сказать, что это некорневая оболочка Ferrybig 7 лет назад 9
Да, это может быть то, что он имеет в виду. G-Man 7 лет назад 0
7
deshmukh

Вероятно, более простым решением является использование trash-cliпакета. Тогда вы можете просто сделать, alias myrm=trashа затем trash fooвыполнить то, что вы хотите. За исключением того, что foo теперь пойдет в~/. local/share/Trash

4
chloesoe

Проблема в том, что mvвы должны использовать его как mv source destination.

С твоим псевдонимом все наоборот mv destination source.

Также вам не нужна звездочка *в конце, потому что она работает с местом назначения в виде папки. Убедитесь, что ваша папка /home/user/Trashсуществует с mkdir /home/user/Trash.

Чтобы решить вашу идею псевдонима, я бы порекомендовал вам взглянуть на следующие вопросы:

Это приведет к этому решению; пожалуйста, добавьте это к себе ~/.bashrcи сделайте source ~/.bashrcпосле добавления:

myrm() { /bin/mv "$@" /home/user/Trash/ } 
Ответ в ссылках, я не люблю копировать чужие работы chloesoe 7 лет назад 0
Я видел этот ответ, когда он был единственным здесь. Если бы у него было явное решение, я бы сразу проголосовал за него. Я колебался, но в конечном итоге проголосовал, потому что ссылки полезны, они дают представление и остаются в Stack Exchange. Основная проблема, связанная с ответами только по ссылке, заключается в том, что связанная цель может исчезнуть, но я ожидаю, что если эти цели внезапно исчезнут из Интернета, то же будет и весь этот вопрос. Kamil Maciorowski 7 лет назад 0
добавил решение и оставил наиболее подходящую ссылку, другая ссылка была https://stackoverflow.com/q/4438147/7311363 qft chloesoe 7 лет назад 0
2
vera

Как указано в комментариях, mvсинтаксис вы можете сделать иначе:

myrm(){ mv "$@" $HOME/Trash/; } 

который может обрабатывать несколько файлов в качестве аргумента

Однако этот простой псевдоним не обрабатывает конфликты имен файлов, а также метаданные (откуда они были удалены, ...).

Для более полного решения, вы можете просто использовать пакет, trash-cliкоторый довольно хорош и поставляется с несколькими инструментами (например, пустые файлы, которые находятся в корзине в течение X дней, ...).

1
PTRK

Есть еще один полезный псевдоним, который вы могли бы рассмотреть, если gvfs-binна вашем хосте установлен пакет:

alias myrm='gvfs-trash` 

Он перемещает ваши файлы в корзину. Кроме того, правильные файлы записываются в вашу папку $ TRASH (например info/, files/...). Так что вам не нужно беспокоиться об этом. Пример: зайдя в мусорное ведро и нажав restoreбудет отлично работать.

Это избыточно, trash-cliно на вашем хосте может быть установлен только один из них, поэтому, если у вас нет trash-cli, попробуйте.

Это лучше или хуже пакета `trash-cli`? Это требует установки gvfs-bin, который также не установлен в моей системе. Я никогда раньше не сталкивался с gvfs и просто прочитал об этом немного по адресу https://en.wikipedia.org/wiki/GVfs. Я до сих пор не уверен, что это за смысл, но это другой вопрос. Joe 7 лет назад 0
На всей системе (в основном на Ubuntu) я использовал, она уже была установлена, поэтому я и предложил ее; Но так как вы говорите мне, что это не обязательно, trash-cli не может быть лучше или хуже. Я буду обновлять свой ответ соответственно PTRK 7 лет назад 1
0
JustAProGamerAndDeveloper

Вам нужно сделать

mv "$1" /home/user/Trash/
или же
mv -t /home/user/Trash/
вместо
mv /home/user/Trash/
Manpage здесь

Первый (`mv" $ 1 "/ home / user / Trash /`) не будет работать в псевдониме (о чем вопрос), и имеет ограниченную ценность в функции (как я сказал в [my ответ] (https://superuser.com/q/1252676/354511#1252685), лучше `` mv "$ @" / home / user / Trash``). Второй (`mv -t / home / user / Trash /`) уже был указан в моем ответе и [комментарии Сайруса] (https://superuser.com/q/1252676/354511#comment1840104_1252676) до этого. G-Man 7 лет назад 0

Похожие вопросы