Simula a ação do comando mv

11

Estou movendo alguns arquivos e quero ter certeza de que o comando mv que digitei está correto antes de prosseguir e executá-lo.

Se eu estivesse usando apt-get , poderia usar o sinal -s para executar uma simulação que realmente faria qualquer coisa.

O mv tem uma função semelhante, que simularia a movimentação dos arquivos, mas na verdade não faria nada?

    
por starbeamrainbowlabs 28.06.2016 / 10:47

3 respostas

1

Este script deve fazer o truque. Ele também pode manipular vários arquivos / diretórios de origem. Use-o da mesma maneira que você usaria mv - mvsim source... dest . Note que ele não presta atenção a opções, nem as filtra (apenas as trata como nomes de arquivos) e pode não funcionar bem com links simbólicos.

#!/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 "" ]; then
        if [ -d "" ]; then
            echo "Moves directory  (and anything inside it) into directory "
            exit 0
        elif [ ! -e "" ]; then
            echo "Renames directory  to "
            exit 0
        else
            echo "Error:  is not a directory; mv cannot overwrite a non-directory with a directory."
            exit 1
        fi
    else
        if [ -d "" ]; then
            echo "Moves file  into directory "
        elif [ -e "" ]; then
            echo "Renames file  to , replacing file "
        else
            echo "Renames file  to "
        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

Alguns exemplos:

$ 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.
    
por insert_name_here 28.06.2016 / 14:09
10

A função abaixo é para verificar detalhadamente a sintaxe mv . Note que ele só funciona para 2 argumentos, SOURCE e DESTINATION, e não verifica se há -t flag.

A função deve ser colocada em ~/.bashrc . Para usá-lo imediatamente, abra um novo terminal ou execute 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 "" > /dev/null 
    then
        echo "<<< ERROR: " "$item" " doesn't exist"
        return 1
    fi

    # check where file goes

    if [ -d ""  ]
    then
        echo "Moving " "" " into " "" " directory"
    else
        echo "Renaming "  "" " to " "" 
    fi

}

Veja alguns testes:

$> 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 
    
por Sergiy Kolodyazhnyy 28.06.2016 / 11:27
4

Existe um programa no github chamado talvez que pode ser o que você está procurando.

De acordo com a descrição do projeto, maybe

  

... permite que você execute um comando e veja o que ele faz com seus arquivos sem realmente fazer isso! Depois de analisar as operações listadas, você pode decidir se deseja realmente que essas coisas aconteçam ou não.

Portanto, ele também mostrará o que outros programas farão com seus arquivos, não apenas mv .

maybe precisa do Python para ser executado, mas isso não deve ser um problema. É fácil instalá-lo ou construí-lo usando o pip do gerenciador de pacotes do Python.

O processo de instalação e o uso do programa são descritos na página inicial do projeto. Infelizmente eu não tenho acesso a um sistema Linux no momento, então não posso fornecer nenhum exemplo sobre o uso do programa.

    
por maddin45 28.06.2016 / 13:38