在同一文件夹终端脚本中复制多个同名文件

Posted

技术标签:

【中文标题】在同一文件夹终端脚本中复制多个同名文件【英文标题】:Copying multiple files with same name in the same folder terminal script 【发布时间】:2013-01-30 12:16:35 【问题描述】:

我有很多同名的文件,目录结构(简化)如下:

 ../foo1/bar1/dir/file_1.ps  
 ../foo1/bar2/dir/file_1.ps  
 ../foo2/bar1/dir/file_1.ps
 .... and many more

因为通过转到 相应的目录,我想将它们全部复制到另一个目录中,但包括 前两个目录的名称(与我的目的相关) 文件名。

我以前试过这样,但我无法从哪里得到哪个文件,因为他们 都是连续命名的:

#!/bin/bash -xv

cp -v --backup=numbered  */*/dir/file* ../plots/; 

../plots 是我复制它们的文件夹。但是,它们现在的格式为 file.ps.~x~(x 是一个数字),所以我去掉了“.ps.~*~”,只留下 ps 扩展名:

rename 's/\.ps.~*~//g' *;
rename 's/\~/.ps/g' *;

然后,由于ps文件有时有数百个点并且需要很长时间才能打开,所以我将它们转换为jpg。

for file in * ; do convert -density 150 -quality 70 "$file" "$file/.ps/".jpg; done;

这不是一个真正有效的 bash 脚本,因为我必须手动更改目录。

我想最好的方法是从名称开始复制文件 复制的文件名中包含的前两个目录。

我该如何做最后一件事?

【问题讨论】:

【参考方案1】:

如果你只有两级目录,你可以使用

for file in */*/*.ps
do 
    ln "$file" "$file//\//_"
done

这会遍历每个 ps 文件,并将它们硬链接到当前目录,并将 /s 替换为 _。如果您打算编辑文件但不想更新原始文件,请使用 cp 而不是 ln

对于任意目录级别,您可以使用 bash 特定的

shopt -s globstar
for file in **/*.ps
do 
    ln "$file" "$file//\//_"
done

但是您确定需要将它们全部复制到一个目录吗?您可能可以使用yourreader */*/*.ps 打开它们,这取决于您的读者可能会在仍然看到完整路径的同时让它们一一浏览。

【讨论】:

你可能不想打开很多ps文件,除非你想让你的电脑爆炸。【参考方案2】:

你应该运行一个查找命令并首先打印名称

find . -name "file_1.ps" -print

然后遍历它们中的每一个并将/的字符串替换为'-'或任何其他字符

$filename/\//-

一般语法是$string/substring/replacement。然后您可以将其复制到所需的目录。完整的脚本可以写成如下。尚未对其进行测试(目前不在 linux 上),因此如果您遇到任何语法错误,您可能需要调整代码;)

for filename in `find . -name "file_1.ps" -print`
do
     newFileName=$filename/\//-
     cp $filename YourNewDirectory/$newFileName
done

如果要将上述脚本放在其他目录中,则需要将脚本放在同一根目录中或更改 find 命令以查找特定目录。

参考文献

string manipulation in bash find man page

【讨论】:

以上是关于在同一文件夹终端脚本中复制多个同名文件的主要内容,如果未能解决你的问题,请参考以下文章

如何用bat批量移动文件夹内与文件夹同名的文件到指定文件夹?

合并两个目录,保留任何同名文件

使用批处理脚本从多个相同的 .txt 文件中复制某个值 [重复]

Linux下把目录拷贝到全部同名目录的脚本

如何在 Linux 中使用终端命令将文件参数传递给我的 bash 脚本? [复制]

如何在linux终端上替换多个文件中的一行? [复制]