Pushd Popd의 작동 방식과 유사하게 다양한 위치에 있는 여러 파일을 빠르게 닫고 다시 열 수 있는 명령이 있습니까?

Pushd Popd의 작동 방식과 유사하게 다양한 위치에 있는 여러 파일을 빠르게 닫고 다시 열 수 있는 명령이 있습니까?

여러 파일을 빠르게 편집하고 싶습니다. 비슷한 방식으로 파일을 쌓을 수 있는 도구가 있으면 pushd좋을 것 같습니다 popd. 그런 도구가 존재하나요? 그렇지 않다면 어떤 제안이 있습니까?

이런 식으로 스택에 있는 파일을 나열할 수 있어야 할 것 같습니다.

files -v
  0 /etc/bind/named.conf.options
  1 /etc/default/bind9
  2 /etc/bind/named.conf.local

그런 다음 아래와 같이 편집할 파일을 엽니다.

nano ~2

동시에 여러 파일을 편집할 수 있지만 동일하지는 않다는 것을 알았습니다. 파일이 여러 개 열려 있는 경우 nano ./test.txt /etc/another_test.txt변경 사항 테스트와 같은 다른 작업을 수행하려면 열려 있는 각 파일을 닫고 저장하여 Nano를 종료해야 합니다. 그렇다고 해서 변경 사항을 테스트하기 위해 파일을 다시 열거나 여러 tty를 열 때 History 명령을 사용하는 것에서 실제로 벗어나지는 않습니다.

답변1

Bash에서는 다음과 같은 것이 도움이 될 수 있습니다.

#!/bin/bash

filelist=()

function fadd() {
    filelist+=("${@}")
}

function fdel() {
    local -r index="${1}"
    newstack=()

    for ((i = 0; i < ${#filelist[@]}; ++i)); do
        if [[ "${i}" != "${index}" ]]; then
            newstack+=( "${filelist[${i}]}" )
        fi
    done

    filelist=( "${newstack[@]}" )
}

function flist() {
    for ((i = 0; i < ${#filelist[@]}; ++i)); do
        printf "%2d %s\n" "${i}" "${filelist[${i}]}"
    done
}

function fedit() {
    local -r index="${1:-0}"

    ${EDITOR} "${filelist[${index}]}"
}

function fget() {
    local -r index="${1:-0}"

    echo "${filelist[${index}]}"
}

이는 처음에 비어 있는 배열 filelist과 해당 배열에서 작동하는 함수 세트를 정의합니다.

  • fadd()함수는 배열 끝에 이름을 추가합니다.
  • fdel()함수는 인덱스를 기반으로 배열에서 요소를 삭제합니다.
  • flist()함수는 배열의 내용과 해당 인덱스를 나열합니다.
  • 이 함수는 주어진 index 에 해당하는 파일이 포함된 fedit()편집기( 로 정의됨)를 엽니다 .${EDITOR}filelist
  • fget()함수는 주어진 인덱스에 있는 파일의 파일 이름을 인쇄합니다.

여기에는 오류 검사가 포함되지 않습니다(예: 잘못된 인덱스를 제공할 수 있음). 또한 파일 이름에 공백을 사용하여 이것을 테스트하지 않았다는 점에 유의하십시오. 이것은 전혀 제대로 작동하지 않을 수 있습니다.

위의 내용이 포함된 파일을 얻으면 다음을 수행할 수 있습니다.

$ source file_mgmt

# Add some files of interest
$ fadd ~/src/foo.[ch]
$ fadd /tmp/bar.txt
$ fadd ~/.bashrc

# View the file list
$ flist
 0 /home/user/src/foo.c
 1 /home/user/src/foo.h
 2 /tmp/bar.txt
 3 /home/user/.bashrc

# Open a file from the list by index
$ fedit 0
[ my ${EDITOR} opened with /home/user/src/foo.c ]

# Remove a file from the list
$ fdel 2

$ flist
 0 /home/user/src/foo.c
 1 /home/user/src/foo.h
 2 /home/user/.bashrc

# Copy ~/.bashrc to tmp
$ cp $(fget 2) /tmp

파일 목록은 셸별로 작성됩니다. 예를 들어 여러 터미널이 열려 있는 경우 별도의 파일 목록이 표시됩니다.

관련 정보