Simulasikan aksi perintah mv

13

Saya memindahkan beberapa file, dan saya ingin memastikan bahwa mvperintah yang saya ketik sudah benar sebelum saya melanjutkan dan menjalankannya.

Jika saya menggunakan apt-get, saya bisa menggunakan -sbendera untuk melakukan simulasi yang benar-benar akan melakukan apa saja.

Apakah mvmemiliki fungsi yang serupa, yang akan mensimulasikan perpindahan file tetapi tidak benar-benar melakukan apa pun?

starbeamrainbowlabs
sumber
2
Di man mvaku hanya bisa melihat -i-flag, yang meminta sebelum menimpa
Kev Inski
2
mvPerintah tidak memiliki simulateapa - apa, tetapi saya dapat menulis fungsi yang melakukan pemeriksaan seperti itu. Bagaimana solusinya?
Sergiy Kolodyazhnyy
2
Dan seperti apa kira-kira simulasi itu? Cukup mencetak satu baris per file yang diubah, mengatakan misalnya "Mengganti nama a.txt menjadi b, txt" atau "Pindah / home / you / a.txt ke / home / you / Dokumen / a.txt"?
Byte Commander
@ByteCommander Sesuatu seperti itu, ya. Saya hanya paranoid tentang membuat kesalahan ketika memindahkan sertifikat ssl pribadi saya untuk mengaturnya.
starbeamrainbowlabs
4
The -npilihan untuk mvakan memastikan Anda tidak bisa menimpa file apapun oleh kesalahan, bukan jawaban tapi selalu berguna untuk mengetahui.
Arronical

Jawaban:

2

Script ini harus melakukan trik. Ia dapat menangani banyak file sumber / direktori juga. Gunakan dengan cara yang sama seperti yang Anda gunakan mv- mvsim source... dest. Perhatikan bahwa itu tidak memperhatikan opsi, juga tidak memfilternya (itu hanya memperlakukannya sebagai nama file) dan mungkin tidak berfungsi dengan baik dengan symlink.

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

Beberapa contoh:

$ 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.
masukkan_name_di sini
sumber
Terima kasih! Saya menerima ini sebagai jawaban atas skrip yang ditulis Serg karena mencakup lebih dari 2 argumen. maybeterlihat bagus juga, tetapi saya merasa bahwa ini adalah pilihan yang lebih aman saat ini.
starbeamrainbowlabs
10

Fungsi di bawah ini untuk memeriksa mvsintaksis secara verbal . Perhatikan, bahwa itu hanya berfungsi untuk 2 argumen, SUMBER dan TUJUAN, dan tidak memeriksa -tbendera.

Fungsi ini akan ditempatkan ~/.bashrc. Untuk menggunakannya segera, buka terminal baru atau jalankansource ~/.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

}

Inilah beberapa uji coba:

$> 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 
Sergiy Kolodyazhnyy
sumber
1
Anda harus menambahkan ay / n untuk melanjutkan dan memanggil mv yang sebenarnya. ;)
chaskes
6

Ada program di github yang disebut mungkin yang mungkin Anda cari.

Menurut deskripsi proyek mereka, maybe

... memungkinkan Anda untuk menjalankan perintah dan melihat apa yang dilakukannya pada file Anda tanpa benar-benar melakukannya! Setelah meninjau operasi yang terdaftar, Anda kemudian dapat memutuskan apakah Anda benar-benar ingin hal-hal ini terjadi atau tidak.

Jadi itu juga akan menunjukkan kepada Anda apa program lain yang akan dilakukan untuk file Anda, tidak hanya mv.

maybemembutuhkan Python untuk dijalankan, tetapi itu seharusnya tidak menjadi masalah. Sangat mudah untuk menginstal atau membangunnya menggunakan pip manajer paket Python.

Proses instalasi dan penggunaan program keduanya dijelaskan di beranda proyek. Sayangnya saya tidak memiliki akses ke Sistem Linux saat ini, jadi saya tidak dapat memberi Anda contoh tentang penggunaan program.

maddin45
sumber
Betapa bagusnya semuanya, sesuai dengan dokumentasi: "tidak pernah digunakan maybeuntuk menjalankan kode yang tidak dipercaya"!
grooveplex
@grooveplex Apakah Anda tidak mempercayai implementasi mvpada sistem Anda?
maddin45
ya, saya lakukan, tetapi itu dimaksudkan sebagai head-up
grooveplex