我没有编写脚本的经验,我需要一些问题的帮助。 我有一个包含.pdf和.jpg对(相同名称但不同类型)的文件夹。 e.g。
file00.pdf
file00.jpg
file01.pdf
file01.jpg
file02.pdf
file02.jpg
...
我有一个看起来像这样的.xml:
<x>
<y> lorem ipsuma </y>
<test name="01fancyname.txt">
</test>
</x>
<x>
<y> lorem ipsumb </y>
<test name="02fancyname.txt">
</test>
</x>
<x>
<y> lorem ipsumc </y>
<test name="03fancyname.txt">
</test>
</x>
因此,我要提取的名称始终位于<test name="
和.txt">
之间。
我想:
删除第一对后,对的数量将与xml中的名称数量相同。文件夹中的第一对与xml中的第一个名称相对应,依此类推。
e.g。
file00.pdf is deleted
file00.jpg is deleted
file01.pdf becomes 01fancyname.pdf
file01.jpg becomes 01facyname.jpg
file02.pdf becomes 02fancyname.pdf
file02.jpg becomes 02facyname.jpg
etc
文件按名称排序,就像在示例中一样。 谢谢!
答案 0 :(得分:0)
整个答案是:(解释如下)
paste <(grep -o 'name="[^"]*"' *.xml | cut -d'"' -f2 | cut -d'.' -f1 | awk '{print $0; print $0;}' -) <(awk 'NR <= 2 {system("rm "$9);} NR > 2 && NF >= 9 {print $9;}' <(ls -l *.jpg *.pdf) | sort) | awk '{match($2,/[a-zA-Z0-9]+(\.[a-zA-Z]+)/,a); system("mv "$2" "$1a[1]);}' -
Paste
有2个输入,第一个是:
grep -o 'name="[^"]*"' *.xml | cut -d'"' -f2 | cut -d'.' -f1 | awk '{print $0; print $0;}' -
它的输出是:
01fancyname
01fancyname
02fancyname
02fancyname
03fancyname
03fancyname
这里我从XML文档中获取文件名(没有扩展名),然后打印两次(因为我们将移动2个文件,pdf和jpg)。
第二个论点是:
awk 'NR <= 2 {system("rm "$9);} NR > 2 && NF >= 9 {print $9;}' <(ls -l *.jpg *.pdf) | sort
它的输出是:
file01.jpg
file01.pdf
file02.jpg
file02.pdf
file03.jpg
file03.pdf
请注意,使用file00.jpg
中的file00.pdf
删除了system("rm "$0);
和AWK
)。
一旦我们有了这些输入,就让我们粘贴! paste <(...) <(...)
01fancyname file01.jpg
01fancyname file01.pdf
02fancyname file02.jpg
02fancyname file02.pdf
03fancyname file03.jpg
03fancyname file03.pdf
最后,我们使用原始文件中的正则表达式获取扩展,并允许执行mv
来更改名称:
awk '{match($2,/[a-zA-Z0-9]+(\.[a-zA-Z]+)/,a); print ("mv "$2" "$1a[1]);}' -
就是这样。执行的命令是:
rm file00.jpg
rm file00.pdf
mv file01.jpg 01fancyname.jpg
mv file01.pdf 01fancyname.pdf
mv file02.jpg 02fancyname.jpg
mv file02.pdf 02fancyname.pdf
mv file03.jpg 03fancyname.jpg
mv file03.pdf 03fancyname.pdf