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

标签 bash scripting copy rename

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

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

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

我该怎么做最后一件事?

最佳答案

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

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

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

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

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

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

关于bash - 在同一文件夹终端脚本中复制多个同名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14879174/

相关文章:

bash - 如何在 Bash 中删除字符串的第一部分?

python - 学习 Python 之外的脚本语言

windows - 将子文件夹的内容复制到另一个文件夹

bash - "set -e"如何与子 shell 一起工作?

regex - 使用sed删除第10个字符和第10个之后的第一个句点之间的字符

bash - 提取值并读取为变量

Java:如何复制目录但排除主目录深处的一些目录

python - 多次克隆一个 NumPy 数组

bash - 如果连接中断,ffmpeg 从实时流中录制视频将关闭

python - 如何在 python 中从 perforce check out 文件?