2010-10-05 83 views
2

我正在使用shell脚本读取一个包含某些文件路径的属性文件。现在取决于这个文件路径,我想创建zip文件的名称。事情是这样的......我的属性文件内容::如何使用shell脚本在unix中创建所需的文件名

path=tmp/inputs/logs/abc 
path=tmp/backup/inte/xyz 
destpath=abc/xyz 

现在我能够创建文件名为abc.zip和xyz.zip为:

paths=`grep path myfile.property |cut -d= -f2` 
d_path=`grep destpath myfile.property |cut -d= -f2`  
filename=$d_path/$(basename $paths).zip 

其中创建abc.zip和xyz.zip。但是我想通过获取路径的最后三个参数来创建名称。事情是这样的......

  • abc.zip应该inputs_logs_abc.zip
  • xyz.zip应该backup_inte_xyz.zip

编辑

Paths=`grep path myfile.txt |cut -d= -f2` 

d_Path=`grep destpath myfile.txt |cut -d= -f2` 

for s_Path in $Paths 

    do 

     prefix=${Paths%%/*/*/*}  
     without_prefix=${Paths##${prefix}/} 
     slashes_to_underscores=${without_prefix//\//_} 
     zipFile=$d_Path/${slashes_to_underscores}.zip 
     find $s_Path -type f -name "*.log" | xargs zip -mT $zipFile [email protected] 

    done 

以上就是我code.By使用这个我不能达到我的目标。 有人可以帮助我吗?

+0

你正在编写哪个shell?这些片段中的'destpath'和'd_path'的相关性是什么? – Johnsyweb 2010-10-05 17:13:52

+0

我正在使用bash.destpath是属性文件中存在的关键字,据此我读取此文件并将此路径存储在d_path变量中。 – MAS1 2010-10-05 17:52:46

+0

然后我的答案应该可以解决你的问题。你可以在提示符下试一试,并在你去看它是如何工作的时候回显变量。 – Johnsyweb 2010-10-05 18:36:11

回答

3

由于您使用bash(这也适用于zsh或类似的),您可以使用其内置的参数替换。

% path=tmp/inputs/logs/abc 
% prefix=${path%%/*/*/*} 
% without_prefix=${path##${prefix}/} 
% slashes_to_underscores=${without_prefix//\//_} 
% filename=${slashes_to_underscores}.zip   
% echo $filename   
inputs_logs_abc.zip 

根据需要,可以在${filename}之前加上${d_path}。在我的示例中,$path是硬编码的,您将根据fahd's answeryour previous question,在${paths}的循环中分配此值。

  • ${var//exp/sub}替换$varexp所有实例sub
  • ${var%%exp}var
  • ${var##exp}正确修剪的exp任何实例从var

左修剪的exp任何实例编辑(在一些睡眠和澄清之后):

prefix=${path%%/*/*/*}做一个贪婪匹配从右到左。如果你在tmp之前有'/',这将会中断(这不是你在评论中所说的,而是会给出结果)。将此行更改为prefix=${path%/*/*/*}(单个百分比符号:非贪婪),并且应该修复更长和更短的路径。

编辑2(以下更新质问):

我可以看到三个问题:

  1. “路径= grep path myfile.txt |cut -d= -f2” #这 “destpath = ABC/XYZ” 匹配,你应该grep'^path='以获得以“path =”开头的行。
  2. 您在循环内使用${Paths}两次,您应该使用(好奇命名)${s_Path}
  3. 您仍在使用prefix=行中的贪婪匹配。看我以前的编辑。
+0

@ Johnsyweb,thanx回复。但是,上面的代码文件夹全路径文件名,意味着如果路径是路径= tmp/xyz /输入/日志/ abc然后它创建文件名为tmp_xyz_inputs_logs_abc.zip。但是我只想把最后三个目录命名为inputs_logs_abc.zip。 – MAS1 2010-10-06 06:02:20

+0

我在循环中使用你的代码(fahd的答案),它出现在我以前的问题中。 – MAS1 2010-10-06 06:03:34

+0

我的示例中的代码是直接从命令行复制的。 'path = tmp/inputs/logs/abc'是输入,'inputs_logs_abc.zip'是输出结果。请附上您现在具有的完整代码作为您的问题的编辑,以便我可以查看错误的位置。 – Johnsyweb 2010-10-06 06:34:09

0

这是否适合您?

paths=$(grep path myfile.property |cut -d= -f2) 
d_path=$(grep destpath myfile.property |cut -d= -f2) 
extname=$(echo $paths | sed 's%^.*/\([^/]*/[^/]*/[^/]*\)$%\1%;s%/%_%g') 
filename=$d_path/$extname.zip 

sed脚本的第一个替代现在的路径的最后三个组件之前删除一切 - 不删除任何东西,如果只有两个 - 和第二剩余斜线映射到下划线。请注意,如果路径具有尾部斜杠(尽管您可以添加替代项以删除它们),您将遇到问题。如果名称中包含/tmp/pattern,则还会在名称中使用前导下划线。您可能需要担心使用'[^/][^/]*'来代替'[^/]*',以确保没有空的组件名称(然后您也可能担心加倍的斜杠)。 GNU Sed为您提供了额外的正则表达式功能,因此您可以使用'[^/]+'代替。

+0

Thanx for reply ..但是我在这里给出的路径都只是例子..所以我们无法预测路径中的任何关键字。但是属性文件中的路径和d_path关键字是最终的。 – MAS1 2010-10-05 16:40:31