rm을 휴지통으로 이동

rm을 휴지통으로 이동

파일을 삭제하는 대신 특별한 "휴지통" 위치로 이동할 수 있는 Linux 스크립트/응용 프로그램이 있습니까? 나는 이것을 대신 사용하고 싶습니다 rm(아마도 후자의 별칭일 수도 있습니다. 이것은 장단점이 있습니다).

"휴지통"이란 특수 폴더를 의미합니다. 단일이 mv "$@" ~/.trash첫 번째 단계이지만 이상적으로는 오래된 휴지통 파일을 덮어쓰지 않고 동일한 이름을 가진 여러 파일을 휴지통으로 처리해야 합니다.다시 덮다간단한 명령(일종의 "실행 취소")을 사용하여 파일을 원래 위치로 복원합니다. 또한 재부팅 시 쓰레기가 자동으로 비워지면 좋을 것입니다(또는 무한 성장을 방지하기 위한 유사한 메커니즘).

이에 대한 부분적인 해결책이 있지만 "복원" 작업이 특히 중요합니다. 그래픽 셸이 있는 형편없는 시스템에 의존하지 않는 기존 솔루션이 있습니까?

(그런데 사람들은 빈번한 백업과 VCS를 사용하는 것과는 대조적으로 이 접근 방식이 합리적인지 여부에 대해 논쟁을 벌여 왔습니다. 이러한 논의는 모두 의미가 있지만, 제가 요구하는 것에 대한 시장은 여전히 ​​있다고 믿습니다.)

답변1

하나 있다빈 사양(초안)freedesktop.org에서. 이는 분명히 데스크탑 환경이 일반적으로 구현하는 것입니다.

명령줄 구현은 다음과 같습니다.쓰레기-cli. 자세히 보지 않아도 원하는 기능을 제공하는 것 같습니다. 그렇지 않다면 이것이 어느 정도 부분적인 해결책인지 알려주십시오.

어떤 프로그램을 대체/별칭으로 사용하는 한 rm, 그렇게 하지 않는 데에는 충분한 이유가 있습니다. 나에게 가장 중요한 것은 다음과 같습니다.

  • 프로그램은 모든 rm옵션을 이해/처리하고 그에 따라 행동해야 합니다.
  • 다른 사람의 시스템에서 작업할 때 "새 rm"의 의미에 익숙해지고 치명적인 결과를 초래하는 명령을 실행할 위험이 있습니다.

답변2

이전 답변에서는 명령 trash-clirmtrash. 기본적으로 두 명령은 Ubuntu 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명령줄에서는 파일 브라우저에서 파일을 선택하고 DEL 버튼을 클릭한 것처럼 작동합니다. 파일은 데스크탑의 휴지통 폴더로 이동됩니다. (해당 옵션을 사용하지 않더라도 -f명령에서 확인 메시지가 표시되지 않습니다.)

이 방법으로 파일을 삭제하는 것은 안전을 위해 파일을 다시 정의하고 모든 삭제를 확인해야 하는 것보다 더 편리하면서도 되돌릴 수 있습니다 rm. rm -i삭제하면 안 되는 파일을 실수로 확인한 경우 여전히 운이 좋지 않을 수 있습니다.

alias tt='gio trash'내 별칭 정의 파일에 tt"trash"에 대한 니모닉을 추가했습니다 .

2018년 6월 27일에 수정됨:서버 시스템에는 휴지통 디렉토리와 동등한 것이 없습니다. 나는 다른 컴퓨터에서 작업을 수행하기 위해 다음 Bash 스크립트를 작성하여 gio trash생성된 휴지통 디렉터리로 인수로 제공된 파일을 이동했습니다. 이 스크립트는 작동 테스트를 거쳤습니다. 저는 항상 이 스크립트를 사용합니다.2024년 4월 12일에 스크립트가 업데이트되었습니다.

#!/bin/bash

# move_to_trash
#
# Teemu Leisti 2024-04-12
#
# USAGE:
#
#   Move the file(s) given as argument(s) to the trash directory, if they are
#   not already there.
#
# RATIONALE:
#
#   The script is intended as a command-line equivalent of deleting a file or
#   directory from a graphical file manager. On hosts that implement the
#   FreeDesktop.org specification on trash directories (hereon called "the trash
#   specification"; see
#   https://specifications.freedesktop.org/trash-spec/trashspec-latest.html),
#   that action moves the target file(s) to a built-in trash directory, and that
#   is exactly what this script does.
#
#   On other hosts, this script uses a custom trash directory (~/.Trash/). The
#   analogy of moving a file to trash is not perfect, as the script does not
#   offer the functionalities of restoring a trashed file to its original
#   location or emptying the trash directory. Rather, it offers an alternative
#   to the 'rm' command, thereby giving the user the peace of mind that they can
#   still undo an unintended deletion before emptying the custom trash
#   directory.
#
# IMPLEMENTATION:
#
#   To determine whether it's running on a host that implements the trash
#   specification, the script tests for the existence of (a) the gio command and
#   (b) either directory $XDG_DATA_HOME/Trash/, or, if that environment variable
#   hasn't bee set, of directory ~/.local/share/Trash/. If the test yields true,
#   the script relies on calling 'gio trash'.
#
#   On other hosts:
#     - There is no built-in trash directory, so the script creates a custom
#       directory ~/.Trash/, unless it already exists. (The script aborts if
#       there is an existing non-directory ~/.Trash.)
#     - The script appends a millisecond-resolution timestamp to all the files
#       it moves to the custom trash directory, to both inform the user of the
#       time of the trashing, and to avoid overwrites.
#     - The user will have to perform an undo by commanding 'mv' on a file or
#       directory moved to ~/.Trash/.
#     - The user will have to empty the custom trash directory by commanding:
#           rm -rf ~/.Trash/* ~/.Trash/.*
#
#   The script will not choke on a nonexistent file. It outputs the final
#   disposition of each filename argument: does not exist, was already in trash,
#   or was moved to trash.
#
# COPYRIGHT WAIVER:
#
#   The author dedicates this Bash script to the public domain by waiving all of
#   their rights to the work worldwide under copyright law, including all
#   related and neighboring rights, to the extent allowed by law. You can copy,
#   modify, distribute, and perform the script, even for commercial purposes,
#   all without asking for permission.

if [ -z "$XDG_DATA_HOME" ] ; then
    xdg_trash_directory=$(realpath ~/.local/share/Trash/)
else
    xdg_trash_directory=$(realpath $XDG_DATA_HOME/Trash/)
fi

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

host_implements_trash_specification=0
if [[ -d "${xdg_trash_directory}" ]] && (( gio_command_exists == 1 )) ; then
    # Executing on a host that implements the trash specification.
    host_implements_trash_specification=1
    trash_directory="${xdg_trash_directory}"
else
    # Executing on other host, so attempt to use a custom trash directory.
    trash_directory=$(realpath ~/.Trash)
    if [[ -e "${trash_directory}" ]] ; then
        # It exists.
        if [[ ! -d "${trash_directory}" ]] ; then
            # But is not a directory, so abort.
            echo "Error: ${trash_directory} exists, but is not a directory."
            exit 1
        fi
    else
        # It does not exists, so create it.
        mkdir "${trash_directory}"
        echo "Created directory ${trash_directory}"
    fi
fi

# Deal with all filenames (a concept that covers names of both files and
# directories) given as arguments.
for file in "$@" ; do
    file_to_be_trashed=$(realpath -- "${file}")
    file_basename=$(basename -- "${file_to_be_trashed}")
    if [[ ! -e ${file_to_be_trashed} ]] ; then
        echo "does not exist:   ${file_to_be_trashed}"
    elif [[ "${file_to_be_trashed}" == "${trash_directory}"* ]] ; then
        echo "already in trash: ${file_to_be_trashed}"
    else
        # ${file_to_be_trashed} exists and is not yet in the trash directory,
        # so move it there.
        if (( host_implements_trash_specification == 1 )) ; then
            gio trash "${file_to_be_trashed}"
        else
            # Move the file to the custom trash directory, with a new name that
            # appends a millisecond-resolution timestamp to the original.
            head="${trash_directory}/${file_basename}"_TRASHED_ON_
            move_file_to="${head}$(date '+%Y-%m-%d_AT_%H-%M-%S.%3N')"
            while [[ -e "${move_file_to}" ]] ; do
                # Generate a new name with a new timestamp, as the previously
                # generated one denoted an existing file or directory. It's very
                # unlikely that this loop needs to be executed even once.
                move_file_to="${head}$(date '+%Y-%m-%d_AT_%H-%M-%S.%3N')"
            done
            # There is no file or directory named ${move_file_to}, so
            # we can use it as the move target.
            /bin/mv "${file_to_be_trashed}" "${move_file_to}"
        fi
        echo "moved to trash:   ${file_to_be_trashed}"
    fi
done

답변3

쓰레기-cliUbuntu에서는 apt-get을 사용하고 Fedora에서는 yum을 사용하여 설치할 수 있는 Linux 애플리케이션입니다. 이 명령을 사용하면 trash listOfFiles지정된 콘텐츠가 휴지통으로 이동됩니다.

답변4

먼저 move_to_trash함수를 정의합니다.

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

그런 다음 별칭은 다음 rm과 같습니다.

alias rm='move_to_trash'

rm다음과 같이 백슬래시를 사용하여 이스케이프 처리하여 언제든지 old를 호출할 수 있습니다 \rm.

재부팅 시 휴지통 디렉터리를 비우는 방법을 모르지만(시스템에 따라 스크립트를 살펴봐야 할 수도 있음 rc*) cron정기적으로 디렉터리를 비우는 작업을 만드는 것도 가치가 있을 수 있습니다.

관련 정보