Імітувати дію команди mv


13

Я переміщую деякі файли, і я хочу переконатися, що mvкоманда, яку я набрав, є правильною, перш ніж я заздалегідь запускаю її.

Якби я використовував apt-get, я міг би використати -sпрапор, щоб виконати симуляцію, яка насправді зробила б щось.

Чи mvє подібна функція, яка б імітувала переміщення файлів, але насправді нічого не робила?


2
В man mvя можу бачити тільки -i-flag, який запитує перед перезаписом
Кев Inski

2
mvкоманда нічого не має simulate, але я можу записати функцію, яка робить перевірку так. Як це рішення?
Сергій Колодяжний

2
А як ви очікуєте виглядати моделювання? SImply друкує один рядок на модифікований файл, повідомляючи, наприклад, "Перейменовано a.txt на b, txt" або "Переміщено / home/you/a.txt у /home/you/Documents/a.txt"?
Байт командир

@ByteCommander Щось подібне, так. Я просто параноїчний щодо помилки, коли переміщую свої приватні сертифікати ssl, щоб організувати їх.
starbeamrainbowlabs

4
-nВаріант mvгарантує , що Ви не можете перезаписати будь-які файли помилково, а не відповідь , але завжди корисно знати.
Арронічний

Відповіді:


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.

Спасибі! Я приймаю це як відповідь над сценарієм, який написав Серг, оскільки він охоплює понад 2 аргументи. maybeвиглядає також добре, але я відчуваю, що це безпечніший варіант на даний момент.
starbeamrainbowlabs

10

Функція нижче - для багатослівної перевірки mvсинтаксису. Зауважте, що він працює лише для 2 аргументів, ДЖЕРЕЛА та ВИЗНАЧЕННЯ, і не перевіряє -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, щоб продовжити та зателефонувати на фактичний телевізор. ;)
chaskes

6

На github існує програма, яка називається, можливо, це те, що ви шукаєте.

Відповідно до їх опису проекту, maybe

... дозволяє запустити команду і побачити, що вона робить для ваших файлів, не роблячи насправді! Переглянувши перераховані операції, ви зможете вирішити, чи дійсно ви хочете, щоб ці речі ставали чи ні.

Так він також покаже, що інші програми будуть робити з вашими файлами, і не тільки mv.

maybeпотрібен Python для запуску, але це не повинно бути проблемою. Його легко встановити або скласти, використовуючи протокол менеджера пакунків Python.

Процес установки та використання програми описані на домашній сторінці проекту. На жаль, на даний момент у мене немає доступу до системи Linux, тому я не можу надати вам жодних прикладів використання програми.


Як добре все це звучить, згідно документації: "ніколи не використовуйте maybeдля запуску ненадійний код"!
grooveplex

@grooveplex Ви не довіряєте впровадженню mvвашої системи?
maddin45

так, я знаю, але це малося на увазі як голова
grooveplex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.