Mô phỏng hành động của lệnh mv


13

Tôi đang di chuyển một số tệp xung quanh và tôi muốn đảm bảo rằng mvlệnh tôi đã nhập là chính xác trước khi tôi tiếp tục và chạy nó.

Nếu tôi đang sử dụng apt-get, tôi có thể sử dụng -scờ để thực hiện một mô phỏng thực sự sẽ làm bất cứ điều gì.

mvmột chức năng tương tự, mà sẽ mô phỏng việc di chuyển của các tập tin nhưng thực sự không làm gì cả?


2
Trong man mvtôi chỉ có thể thấy -i-flag, yêu cầu trước khi ghi đè
Kev Inski

2
mvlệnh không có simulateđiều, nhưng tôi có thể viết một hàm kiểm tra như thế. Giải pháp đó thế nào?
Sergiy Kolodyazhnyy

2
Và bạn mong đợi mô phỏng sẽ như thế nào? SImply in một dòng trên mỗi tệp đã sửa đổi, ví dụ: "Đổi tên a.txt thành b, txt" hoặc "Đã chuyển /home/you/a.txt thành /home/you/Document/a.txt"?
Chỉ huy Byte

@ByteCommander Một cái gì đó như thế, yeah. Tôi chỉ hoang tưởng về việc phạm sai lầm khi di chuyển các chứng chỉ ssl riêng của mình xung quanh để sắp xếp chúng.
starbeamrainbowlabs

4
Các -ntùy chọn để mvđảm bảo bạn không thể ghi đè lên bất kỳ tập tin do nhầm lẫn, không phải là một câu trả lời nhưng luôn luôn hữu ích để biết.
Arronical

Câu trả lời:


2

Kịch bản này nên thực hiện các mẹo. Nó cũng có thể xử lý nhiều tập tin / thư mục nguồn. Sử dụng nó giống như cách bạn sẽ sử dụng mv- mvsim source... dest. Lưu ý rằng nó không chú ý đến các tùy chọn, cũng không lọc chúng ra (nó chỉ coi chúng là tên tệp) và nó có thể không hoạt động tốt với các liên kết tượng trưng.

#!/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

Vài ví dụ:

$ 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.

Cảm ơn! Tôi chấp nhận đây là câu trả lời cho kịch bản mà Serg đã viết bởi vì nó bao gồm hơn 2 đối số. maybecó vẻ tốt, nhưng tôi cảm thấy rằng đây là lựa chọn an toàn hơn vào lúc này.
starbeamrainbowlabs

10

Chức năng dưới đây là để kiểm tra mvcú pháp bằng lời nói. Lưu ý rằng nó chỉ hoạt động cho 2 đối số, NGUỒN và DESTINATION và không kiểm tra -tcờ.

Các chức năng sẽ được đặt vào ~/.bashrc. Để sử dụng ngay lập tức, hãy mở terminal mới hoặc chạysource ~/.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

}

Dưới đây là một số lần chạy thử:

$> 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
Bạn nên thêm ay / n để tiếp tục và gọi mv thực tế. ;)
cuộc trò chuyện

6

Có một chương trình trên github được gọi là có thể đó là những gì bạn đang tìm kiếm.

Theo mô tả dự án của họ, maybe

... Cho phép bạn chạy một lệnh và xem những gì nó làm với các tệp của bạn mà không thực sự làm điều đó! Sau khi xem xét các hoạt động được liệt kê, sau đó bạn có thể quyết định xem bạn có thực sự muốn những điều này xảy ra hay không.

Vì vậy, nó cũng sẽ cho bạn thấy những chương trình khác sẽ làm gì với các tệp của bạn, không chỉ mv.

maybecần Python để chạy, nhưng đó không phải là vấn đề. Thật dễ dàng để cài đặt hoặc xây dựng nó bằng cách sử dụng gói trình quản lý gói của Python.

Quá trình cài đặt và sử dụng chương trình đều được mô tả trên trang chủ của dự án. Thật không may, hiện tại tôi không có quyền truy cập vào Hệ thống Linux, vì vậy tôi không thể cung cấp cho bạn bất kỳ ví dụ nào về việc sử dụng chương trình.


Tất cả âm thanh tốt như thế nào, theo tài liệu: "không bao giờ sử dụng maybeđể chạy mã không tin cậy"!
grooveplex

@grooveplex Bạn không tin tưởng vào việc thực hiện mvtrên hệ thống của mình?
maddin45

vâng, tôi có, nhưng nó có nghĩa là một người đứng đầu
grooveplex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.