mv
我正在移动一些文件,在继续运行之前我想确保我输入的命令是正确的。
如果我正在使用apt-get
,我可以使用该-s
标志来执行实际上可以执行任何事情的模拟。
是否mv
有类似的功能,可以模拟文件的移动但实际上不执行任何操作?
答案1
以下函数用于详细检查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
答案2
github 上有一个名为或许这可能就是您正在寻找的。
根据他们的项目描述,maybe
... 允许您运行命令并查看它对您的文件做了什么,而无需实际执行!查看列出的操作后,您可以决定是否真的希望这些事情发生。
因此,它还将向您显示其他程序对您的文件执行的操作,不仅仅是mv
。
maybe
需要 Python 才能运行,但这应该不是问题。使用 Python 的包管理器 pip 可以轻松安装或构建它。
安装过程和程序的使用方法均在项目主页上进行了描述。遗憾的是,我目前无法访问 Linux 系统,因此无法为您提供有关该程序使用的任何示例。
答案3
此脚本应该可以解决问题。它也可以处理多个源文件/目录。使用方法与使用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.
答案4
创建可执行文件 safemv,内容如下:
#!/bin/bash
# Allows invocation with dryrun=1 and also protects from fraud attempts.
[ -n "$dryrun" ] && dryrun=echo
$dryrun mv "$@"
要测试替换的参数,请使用 dryrun=1 运行此文件,例如:
dryrun=1 ./safemv *.png /tmp/pngs
实际使用时运行此文件而不指定 dryrun:
./safemv *.png /tmp/pngs
这种方法可以与任何有潜在危险的命令一起使用。