MV komutunun eylemini simüle et


13

Bazı dosyaları hareket mvettiriyorum ve devam edip çalıştırmadan önce yazdığım komutun doğru olduğundan emin olmak istiyorum .

Eğer apt-getkullansaydım, -sbayrağı her şeyi yapacak bir simülasyon yapmak için kullanabilirdim .

mvDosyaların taşınmasını simüle eden ama aslında hiçbir şey yapmayan benzer bir işlevi var mı ?


2
Gelen man mvSadece görebilirsiniz -iüzerine yazmadan önce sorar -flag,
Kev Inski

2
mvkomut hiçbir simulateşey yok, ama böyle bir kontrol yapan bir işlev yazabilirsiniz. Bu çözüm nasıl?
Sergiy Kolodyazhnyy

2
Ve simülasyonun nasıl görünmesini bekliyorsunuz? Hemen değiştirilen dosya başına bir satır yazdırılıyor, örn. "A.txt dosyasını b, txt olarak yeniden adlandırdı" veya "/home/you/a.txt dosyasını /home/you/Documents/a.txt dosyasına taşındı mı?"
Bayt Komutanı

@ByteCommander Böyle bir şey, evet. Özel SSL sertifikalarımı düzenlemek için onları hareket ettirirken hata yapma konusunda paranoyak oldum.
starbeamrainbowlabs

4
-nSeçeneği mvyanlışlıkla değil, bir cevap ama her zaman bilmek yararlıdır tarafından herhangi bir dosya üzerine yazamaz sağlayacaktır.
Arronik

Yanıtlar:


2

Bu script hile yapmalı. Çok sayıda kaynak dosyasını / dizini de işleyebilir. Eğer kullandığınız aynı şekilde kullanın mv- mvsim source... dest. Seçeneklere dikkat etmediğini ve bunları filtrelemediğini (sadece dosya adı olarak ele aldığını) ve sembollerle iyi çalışmayabileceğini unutmayın.

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

Bazı örnekler:

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

Teşekkürler! Bunu Serg'in yazdığı senaryoda cevap olarak kabul ediyorum çünkü 2'den fazla argümanı kapsıyor. maybeçok iyi görünüyor, ama şu anda bunun daha güvenli bir seçenek olduğunu hissediyorum.
starbeamrainbowlabs

10

Aşağıdaki işlev mvsözdizimini ayrıntılı bir şekilde kontrol etmektir . Unutmayın, sadece 2 argüman için çalışır, SOURCE ve DESTINATION ve -tbayrak olup olmadığını kontrol etmez .

Fonksiyon yerleştirilmelidir ~/.bashrc. Hemen kullanmak için yeni terminal açın veya çalıştırınsource ~/.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

}

İşte bazı test çalışmaları:

$> 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
Devam etmek ve gerçek mv'yi çağırmak için ay / n eklemelisiniz. ;)
chaskes

6

Denilen github bir programm vardır belki aradığınız şey olabilen.

Proje tanımlarına göre, maybe

... bir komut çalıştırmanıza ve dosyalarınıza gerçekte ne yapmadan yaptıklarına bakmanıza izin verir! Listelenen işlemleri inceledikten sonra, bunların gerçekten olmasını isteyip istemediğinize karar verebilirsiniz.

Böylece, diğer programların dosyalarınıza ne yapacağını da gösterecek, sadece değil mv.

maybeçalıştırmak için Python gerekiyor, ama bu bir sorun olmamalı. Python'un paket yöneticisi pipini kullanarak kurmak veya kurmak kolaydır.

Kurulum süreci ve programın kullanımı projenin ana sayfasında açıklanmaktadır. Ne yazık ki şu anda bir Linux Sistemine erişimim yok, bu yüzden size programın kullanımı hakkında herhangi bir örnek veremem.


Ne kadar iyi geliyor, belgelere göre: "asla maybegüvenilmeyen kodu çalıştırmak için kullanmayın "!
grooveplex

@grooveplex mvSisteminizin uygulanmasına güvenmiyor musunuz ?
maddin45

evet, yapıyorum, ama bir kafa
vuruşu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.