我有很多同名文件,目录结构(简化)如下:
../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/