จำลองการกระทำของคำสั่ง mv


13

ฉันย้ายไฟล์ไปมาและฉันต้องการให้แน่ใจว่าmvคำสั่งที่ฉันพิมพ์นั้นถูกต้องก่อนที่จะดำเนินการต่อ

ถ้าฉันใช้apt-getฉันสามารถใช้-sธงเพื่อจำลองสถานการณ์ที่จริง ๆ แล้วจะทำอะไรก็ได้

ไม่mvได้มีหน้าที่คล้ายกันที่จะจำลองการเคลื่อนที่ของไฟล์ แต่ไม่ได้ทำอะไร?


2
ในman mvฉันสามารถเห็นเฉพาะ-i
แฟล็ก

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จะช่วยให้คุณไม่สามารถเขียนทับไฟล์ใด ๆ โดยไม่ได้ตั้งใจไม่ได้คำตอบ แต่มีประโยชน์เสมอที่จะรู้ว่า
กำหนดใน

คำตอบ:


2

สคริปต์นี้ควรทำเคล็ดลับ มันสามารถจัดการไฟล์ / ไดเรกทอรีหลายแหล่งได้เช่นกัน ใช้วิธีเดียวกับที่คุณจะใช้-mv mvsim source... destโปรดทราบว่ามันไม่ได้ใส่ใจกับตัวเลือกต่าง ๆ และไม่กรองออก (มันแค่ถือว่าเป็นชื่อไฟล์) และมันอาจทำงานได้ไม่ดีกับ 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

ตัวอย่างบางส่วน:

$ 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 เขียนเพราะครอบคลุมมากกว่า 2 ข้อโต้แย้ง maybeดูดีเหมือนกัน แต่ฉันรู้สึกว่านี่เป็นตัวเลือกที่ปลอดภัยกว่าในเวลานี้
starbeamrainbowlabs

10

ฟังก์ชันด้านล่างใช้สำหรับตรวจสอบmvไวยากรณ์อย่างละเอียด โปรดทราบว่าใช้งานได้เพียง 2 ข้อคือ 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 จริง ;)
chaskes

6

มีโปรแกรมบน github ที่เรียกว่าอาจจะเป็นสิ่งที่คุณกำลังมองหาอยู่

ตามคำอธิบายโครงการ maybe

... ช่วยให้คุณสามารถเรียกใช้คำสั่งและดูว่ามันทำอะไรกับไฟล์ของคุณโดยไม่ต้องทำ! หลังจากตรวจสอบการดำเนินการตามรายการคุณสามารถตัดสินใจได้ว่าคุณต้องการให้สิ่งเหล่านี้เกิดขึ้นจริงหรือไม่

ดังนั้นมันก็จะแสดงสิ่งที่โปรแกรมอื่น ๆ mvจะทำไฟล์ของคุณไม่เพียง แต่

maybeต้องการ Python เพื่อให้ทำงานได้ แต่นั่นไม่ควรเป็นปัญหา ง่ายต่อการติดตั้งหรือสร้างโดยใช้ Piper ผู้จัดการแพ็คเกจ pip

กระบวนการติดตั้งและการใช้งานของโปรแกรมนั้นทั้งอธิบายไว้ในหน้าแรกของโครงการ โชคไม่ดีที่ฉันไม่สามารถเข้าถึงระบบ Linux ได้ในขณะนี้ดังนั้นฉันจึงไม่สามารถให้ตัวอย่างแก่คุณเกี่ยวกับการใช้งานโปรแกรมได้


เสียงดีแค่ไหนตามเอกสาร: "อย่าใช้maybeเพื่อเรียกใช้รหัสที่ไม่น่าเชื่อถือ"!
grooveplex

@grooveplex คุณไม่เชื่อถือการใช้งานmvในระบบของคุณหรือไม่
maddin45

ใช่ฉันทำ แต่มันมีความหมายว่าเป็นหัวขึ้น
grooveplex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.