例如:
7za e -y $file_name -o$dest_directory
当直接从命令行运行时,它工作正常,但在脚本中它会出现此错误:
无法找到档案(没有该名称的档案)。
我曾尝试使用:
7za e -y `ls -a | grep 001` -o`pwd`
这将成功提取文件,但是当脚本结束时,文件无处可寻。
答案1
我从上面的评论中复制粘贴了您的脚本,并在符号处添加了换行符;
以提高可读性:
!/bin/bash
printf "%s\n" "Please enter full path to the vmfile location e.g. /path/to - "
read
vmfile_path=$REPLY
cd $vmfile_path
7za e -y ls -a | grep 001 -o`pwd`
首先,第一行应该是
#!/bin/bash
如果有的话,但我猜那是一个打字错误。您的
read
命令和后续行更容易写成read vmfile_path
。 这样,shebang 实际上也可以更改为 just ,#!/bin/sh
因为您不会使用任何 Bash 特定功能。您应该引用该
cd
参数来处理带有空格的目录名。我猜你想提取一个文件,其名称包含
001
最后一行的字符串。目前它缺少一些流程替换,你的意图可能更接近于:7za e -y $(ls -a | grep 001) -o$(pwd)
与反引号相比,该
$()
语法更易于阅读(并且具有一些其他优点),但它的作用是相同的。我还猜测输出目录默认为输出
pwd
,从而使其成为多余的,但我不确定。如果有多个文件名匹配,您的命令将不会喜欢它
001
。
忽略最后一个问题,你总体上想要的是类似这样的东西:
#!/bin/sh
printf '%s\n' "Please enter full path to the vmfile location e.g. /path/to - "
read vmfile_path
cd "$vmfile_path"
7za e -y "$(ls -a | grep 001)" -o"$(pwd)"
或者,更简单,将最后两行替换为(也将处理多个匹配)(尽管未经测试):
find "$vmfile_path" -maxdepth 1 -name '*001*' -exec 7za e -y -o"$vmfile_path" {} \;
如果您了解更多文件名,名称匹配模式可能会得到改进。