mv 명령의 동작 시뮬레이션


13

일부 파일을 옮기고 mv있는데 입력 한 명령이 올바른지 확인한 다음 계속 실행하십시오.

apt-get사용하는 경우 -s플래그를 사용하여 실제로 모든 작업을 수행하는 시뮬레이션을 수행 할 수 있습니다.

음주자 mv유사한 기능을 가지고, 그것은 파일의 이동하지만, 실제로는 아무것도하지를 시뮬레이션 할 것인가?


2
에서 man mv나는 단지 볼 수 있습니다 -i덮어 쓰기 전에 요청 -flag,
케빈 Inski

2
mv명령에는 simulate물건이 없지만 그런 검사를하는 함수를 작성할 수 있습니다. 그 솔루션은 어떻습니까?
Sergiy Kolodyazhnyy

2
그리고 당신은 시뮬레이션이 어떻게 보일 것으로 기대합니까? "파일명을 a.txt에서 b, txt로 바꾸 었음"또는 "/home/you/a.txt를 /home/you/Documents/a.txt로 옮겼습니다"와 같이 수정 된 파일 당 한 줄을 간단히 인쇄 하시겠습니까?
바이트 사령관

@ByteCommander 그래요. 개인 SSL 인증서를 이동하여 구성 할 때 실수를 저지르는 것에 대해 편집증입니다.
starbeamrainbowlabs

4
-n옵션을 사용하는 mv실수하지 대답하지만 항상 알고 도움으로 모든 파일을 덮어 쓸 수 없습니다 보장합니다.
Arronical

답변:


2

이 스크립트는 트릭을 수행해야합니다. 여러 소스 파일 / 디렉토리도 처리 할 수 ​​있습니다. mv- 와 같은 방법으로 사용하십시오 mvsim source... dest. 옵션에주의를 기울이지 않거나 필터링하지 않고 (파일 이름으로 만 처리) 심볼릭 링크에서 제대로 작동하지 않을 수 있습니다.

#!/bin/bash

if [ $# -lt 2 ]; then
    echo "Too few arguments given; at least 2 arguments are needed."
    exit 1
fi

lastArg="${@:$#}"

i=1
for param in "$@"; do
    if [ ! -e "$param" -a $i -lt $# ]; then
        echo "Error: $param does not exist."
        exit 1
    elif [ "$param" = "$lastArg" -a $i -lt $# ]; then
        echo "Error: $param is the same file/directory as the destination."
        exit 1
    fi
    ((i++))
done

if [ $# -eq 2 ]; then # special case for 2 arguments to make output look better
    if [ -d "$1" ]; then
        if [ -d "$2" ]; then
            echo "Moves directory $1 (and anything inside it) into directory $2"
            exit 0
        elif [ ! -e "$2" ]; then
            echo "Renames directory $1 to $2"
            exit 0
        else
            echo "Error: $2 is not a directory; mv cannot overwrite a non-directory with a directory."
            exit 1
        fi
    else
        if [ -d "$2" ]; then
            echo "Moves file $1 into directory $2"
        elif [ -e "$2" ]; then
            echo "Renames file $1 to $2, replacing file $2"
        else
            echo "Renames file $1 to $2"
        fi
        exit 0
    fi
elif [ ! -e "$lastArg" ]; then
    echo "Error: $lastArg does not exist."
    exit 1
elif [ ! -d "$lastArg" ]; then
    echo "Error: $lastArg is not a directory; mv cannot merge multiple files into one."
    exit 1
fi

argsLeft=$#
echo "Moves..."
for param in  "$@"; do
    if [ $argsLeft -eq 1 ]; then
        echo "...Into the directory $param" # has to be a directory because -f $lastArg was dealt with earlier
        exit 0
    fi
    if [ -d "$param" ]; then
        if [ ! -d "$lastArg" ]; then
            echo "Error: $lastArg is not a directory; mv cannot overwrite a non-directory with a directory."
            exit 1
        fi
        if [ $argsLeft -eq $# ]; then
            echo "The directory ${param} (and anything inside it)..."
        else
            echo "And the directory ${param} (and anything inside it)..."
        fi
    else
        if [ $argsLeft -eq $# ]; then
            echo "The file ${param}..."
        else
            echo "And the file ${param}..."
        fi
    fi
    ((argsLeft--))
done

몇 가지 예 :

$ ls
dir1  dir2  file1  file2  file3  mvsim
$ ./mvsim file1 file2
Renames file file1 to file2, replacing file file2
$ ./mvsim file1 newfile
Renames file file1 to newfile
$ ./mvsim file1 dir1
Moves file file1 into the directory dir1
$ ./mvsim file1 file2 file3 dir1
Moves...
The file file1...
And the file file2...
And the file file3...
...Into the directory dir1
$ ./mvsim file1 file2 dir1 dir2
Moves...
The file file1...
And the file file2...
And the directory dir1 (and anything inside it)...
...Into the directory dir2
$ ./mvsim file1 file2 file3 # error - file3 isn't a directory
Error: file3 is not a directory; mv cannot merge multiple files into one.
$ ./mvsim -f -i file1 dir1 # options aren't parsed or filtered out
Error: -f does not exist.

감사! Serg가 두 개 이상의 인수를 다루기 때문에 작성한 스크립트에 대한 답변으로 이것을 받아들이고 있습니다. maybe나도 좋아 보이지만 현재는 이것이 더 안전한 옵션이라고 생각합니다.
starbeamrainbowlabs

10

아래 함수는 mv구문 을 자세하게 검사하기위한 것 입니다. SOURCE 및 DESTINATION의 두 인수에만 작동하며 -t플래그를 확인하지 않습니다 .

이 기능은에 배치됩니다 ~/.bashrc. 즉시 사용하려면 새 터미널을 열거 나 실행하십시오.source ~/.bashrc

mv_check()
{
    # Function for checking syntax of mv command 
    # sort of verbose dry run
    # NOTE !!! this doesn't support the -t flag
    # maybe it will in future (?)

    # check number of arguments  
    if [ $# -ne 2   ]; then
        echo "<<< ERROR: must have 2 arguments , but $# given "
        return 1
    fi

    # check if source item exist
    if ! readlink -e "$1" > /dev/null 
    then
        echo "<<< ERROR: " "$item" " doesn't exist"
        return 1
    fi

    # check where file goes

    if [ -d "$2"  ]
    then
        echo "Moving " "$1" " into " "$2" " directory"
    else
        echo "Renaming "  "$1" " to " "$2" 
    fi

}

다음은 몇 가지 테스트 실행입니다.

$> mv_check  TEST_FILE1  bin/python                                                                                      
Moving  TEST_FILE1  into  bin/python  directory
$> mv_check  TEST_FILE1  TEST_FILE2                                                                                      
Renaming  TEST_FILE1  to  TEST_FILE2
$> mv_check  TEST_FILE1  TEST_FILE 2                                                                                     
<<< ERROR: must have 2 arguments , but 3 given 
$> mv_check  TEST_FILE1  TEST_FILE\ 2                                                                                    
Renaming  TEST_FILE1  to  TEST_FILE 2
$> mv_check  TEST_FILE1  "TEST_FILE 2"                                                                                   
Renaming  TEST_FILE1  to  TEST_FILE 2
$> mv_check  TEST_FILE1                                                                                                  
<<< ERROR: must have 2 arguments , but 1 given 

1
ay / n을 추가하여 계속해서 실제 mv를 호출해야합니다. ;)
16:59에 Chaskes

6

github에는 아마도 당신이 찾고있는 것일 수 있는 프로그램 이 있습니다.

프로젝트 설명에 따르면 maybe

... 명령을 실행하여 실제로 수행하지 않고도 파일에서 수행하는 작업을 확인할 수 있습니다! 나열된 작업을 검토 한 후 이러한 상황이 실제로 발생하는지 여부를 결정할 수 있습니다.

또한 다른 프로그램이 파일에 대해 수행 할 작업을 보여줍니다 mv.

maybe파이썬을 실행해야하지만 문제가되지는 않습니다. Python의 패키지 관리자 pip를 사용하여 쉽게 설치하거나 빌드 할 수 있습니다.

설치 과정과 프로그램 사용법은 모두 프로젝트 홈페이지에 설명되어 있습니다. 불행히도 현재 Linux 시스템에 액세스 할 수 없으므로 프로그램 사용법에 대한 예제를 제공 할 수 없습니다.


문서에 따르면 " maybe신뢰할 수없는 코드를 실행 하는 데 사용하지 마십시오"라는 말이 얼마나 좋은지 !
grooveplex

@grooveplex 당신 mv은 당신의 시스템 에서 구현을 신뢰하지 않습니까?
maddin45

네, 그렇습니다. 그러나 헤즈 업
그루브 플렉스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.