6

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

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

由于通过转到相应目录来查看所有这些 ps 文件效率极低,我想将它们全部复制到另一个目录中,但包括前两个目录的名称(这与我的目的相关)在文件名中。

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

#!/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 脚本,因为我必须手动更改目录。

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

我该怎么做这最后一件事?

4

2 回答 2

7

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

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,这取决于您的读者可能会在仍然看到完整路径的同时逐个浏览它们。

于 2013-02-14T17:04:56.430 回答
3

您应该运行 find 命令并首先打印名称,例如

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 命令以查找特定目录。

参考

于 2013-02-14T17:00:25.157 回答