我想将文件从一个文件夹移动到另一个文件夹。
当文件的格式在 ( file _name.dat
) 之间有空格并且当我使用该命令时mv file _name.dat /tmp
,文件不会移动。
但是当我使用mv "file _name.dat" /tmp
时,文件正在移动。
帮助我编写一个脚本,该脚本有助于在自动移动时将file _name.dat
其更改为。"file _name.dat"
答案1
你的问题很难理解。特别是,您需要复制粘贴您的代码和复制粘贴错误消息。
话虽这么说,你很有可能犯了一个典型的错误……
当 shell 脚本包含变量替换(类似$file
或$1
)时,扩展的结果将被视为以空格分隔的通配符模式序列。该变量不被视为单个单词,而是被视为模式列表。所以如果你写
mv $1 /tmp # <<<< BAD
然后运行myscript "file _name.dat"
,然后该mv
命令接收三个参数:file
、_name.dat
和/tmp
。如果运行myscript "*.dat"
,则.dat
当前目录中的所有文件都将被移动。
为了避免这种情况,请将变量替换放在双引号之间:mv "$1" /tmp
。如果这样做,mv
总是会收到两个参数:脚本的第一个参数和/tmp
。需要将变量值视为通配符模式列表的情况极为罕见,因此请记住这个简单的规则:
始终在变量替换两边加上双引号:
"$foo"
、"$1"
等。这也适用于命令替换:"$(mycommand)"
此外,如果文件名以破折号 ( -
) 开头,mv
则将其视为一个选项。为了避免这种情况,请传递--
以标记选项的结尾:后面的任何内容--
都是非选项参数(文件或目录名,对于mv
)。大多数命令都会识别--
以标记选项的结尾。
mv -- "$1" /tmp
myscript file _name.dat /tmp
如果您想通过在 shell 中编写来调用脚本,这是不可能的。该脚本单独接收参数,它不知道您在命令行上键入了多少个空格。 (这与 Windows 不同,在 Windows 中,程序解析自己的参数。在 unix 上,程序接收参数列表。)如果从另一个 shell 脚本调用脚本,也请在调用脚本中使用正确的引用。