2017-07-18 39 views
0

我想使用不同名称的文件的副本。
我目前正在尝试这些命令,然后将它们放入我的bash脚本。创建重复文件并将其重命名

$ set dir = /somewhere/states 
$ find $dir -name "total.txt" -type f | xargs ls -1 
/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/total.txt 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/total.txt 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/total.txt 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/total.txt 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/total.txt 

我知道我可以用这样的重命名文件,但它不正是我想要的:

$ find $dir -name "total.txt" -exec sh -c 'cp {} `dirname {}`/`basename {} `why.xls' \; 
/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/total.txtwhy.xls 

我可能知道如何复制文件,并有在新的文件相同的目录?下面的例子是

我想将新文件命名为“固定”后面的所有内容。与之前的“/地方”,改变文件扩展名,以及

/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/fl_Asite_ttl.xls 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/hi_Bsite_ttl.xls 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/ky_Asite_ttl.xls 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/mi_Csite_ttl.xls 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/tx_Vsite_ttl.xls 

更新: /somewhere/states/florida_fixed_ttl/fixed.fl_Asite_ttl/somewhere/total.txt

+0

'cat somefile.txt> newfile.txt'? – T4rk1n

+0

嗨@ T4rk1n,我不打算覆盖文件?我试图复制和重命名文件。在同一个目录中有两个相似的文件,但是有不同的名称。 – Santa

+0

该行将完成该操作,读取文件的内容并将其传送到新文件中。 – T4rk1n

回答

1

可能不是最优雅,但这种应工作:

find . -name total.txt | while read F ; do [[ $F =~ fixed.[^/]* ]] ; N=$(echo $BASH_REMATCH | sed s/fixed\.//) ; echo "cp $F $(dirname $F)/$N.xls" ; done 

如果你很高兴与输出只是删除最后的回声,即这样的:

echo "cp $F $(dirname $F)/$N.xls" 

这样:

cp "$F" "$(dirname $F)/$N.xls" 

注意,如果.txt和.xls的内容将永远保持不变,你可以LN改用CP的 - 一个文件,两个人的名字。

+0

谢谢@Wayne,你想介绍一下这个方法吗? 我做了一些搜索,$ BASH_REMATCH实际上包含所有'=〜'结果。那么N部分呢? – Santa

+0

是的,$ BASH_REMATCH将是所有匹配的数组。但知道只有一个匹配,您可以使用$ BASH_REMATCH而不是$ {BASH_REMATCH [1]}。为了改进脚本,应该实际将所有变量包含在双引号中,并在使用$ BASH_REMATCH之前检查匹配的失败/成功返回。 N = $(...)部分只是删除字符串“fixed”。从比赛中,只留下你想要的部分作为文件名。 –

+0

哇谢谢@Wayne Vosberg,最后一件事,由于一些不可预见的情况,路径有一些细微的变化,如上面更新中所示,我试过[[$ F =〜/'fixed.[^/]*“]]和[[$ F =〜/fixed.[//**]],都给出了相同的输出匹配两次的'固定'?!我可以知道如何获得5个文件而不是10个文件吗? – Santa

相关问题