【问题标题】:Bash mv not a directoryBash mv 不是目录
【发布时间】:2017-01-05 23:18:50
【问题描述】:

我的部分脚本是这样的:

while read line  
do 
code=`echo ${line}  | awk  '{print $1}'`
awk -f ${supscript}/rearrange.sh < ${base}/${code}  
mv temp_output* "$code"temp_output* 
done < filelist

脚本正在运行;唯一的问题是,当它尝试重命名文件时,我收到以下错误消息:

mv: target `pollcodetemp_output*' is not a directory

也许这与 IFS 有关。我尝试在脚本的开头将其指定为:

IFS='
'

但它不起作用。我使用的是 Windows 文本编辑器,但我已经删除了 CR。

【问题讨论】:

  • 使用缩进。使用$() 而不是反引号。引用你的变量。 AWK 接受输入文件名作为参数而不需要重定向。几乎总是将-rread 一起使用。

标签: bash mv


【解决方案1】:

很可能,您只需要:

mv temp_output* "$code"

这会将当前目录中名为temp_output*的文件移动到变量$code指定的目录中。

但是,如果$code是一个文件,那么你需要寻找一个rename命令(有几个版本,语法不同),或者你需要使用一个内循环:

for file in temp_output*
do mv "$file" "$code$file"
done

【讨论】:

  • $code 是一个文件。我选择了内部循环解决方案,它工作得很好,并且实现了我想要的。非常感谢。
  • 为什么这不适用于一个文件,如果它只是一个文件,我们必须使用内部循环?
  • @HrvojeT:如果mv 至少使用三个参数调用并且最后一个参数不是目录,您只会收到“不是目录”消息。在上下文中,这意味着 glob 模式 temp_output* 至少匹配两个文件名,可能是由 awk 脚本生成的。
【解决方案2】:

您正在尝试将多个文件移动到一个不是目录的名称,这是不可能的。发生这种情况是因为您似乎试图从通配符模式重命名通配符模式,这也是不可能的。我不会猜测你到底想完成什么,所以我不能给你任何额外的建议。

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 2014-01-09
    • 2014-07-21
    • 2015-03-21
    • 2015-05-22
    • 1970-01-01
    • 2010-09-17
    • 2020-08-08
    • 2012-01-23
    相关资源
    最近更新 更多