![查找同名但不同扩展名的文件,发送到tgz](https://linux22.com/image/1890/%E6%9F%A5%E6%89%BE%E5%90%8C%E5%90%8D%E4%BD%86%E4%B8%8D%E5%90%8C%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E5%8F%91%E9%80%81%E5%88%B0tgz.png)
我有一个来自相机的大量已编辑图像的存档,每个图像实际上是一对文件 - *.nef 和 *.xmp。我想浏览所有文件夹,然后将这些对压缩到单个 tgz 文件中。
目录中的每个文件名都是唯一的,因此将文件名从 的 输出移动ls *.nef
到 command就足够了tar -czf {filename}.tgz {filename}.*
,但恐怕我不知道从哪里开始。
提前致谢。
答案1
一个简短的脚本,xfun:
#!/bin/bash
b=$(basename "$1" .xmp)
# echo "tar -cjf $b.tar.bz2 $b.xmp $b.nef"
tar -cjf "$b.tar.bz2" -- "$b.xmp" "$b.nef"
调用:
find -name "*xmp" -execdir ./xfun {} ";"
答案2
在 zsh 或 bash ≥4 中:
for x in **/*.nef; do
x=${x%.nef}
if [ -e "$x.xmp" ]; then
tar -czf "$x.tgz" -- "$x.nef" "$x.xmp" && rm -- "$x.nef" "$x.xmp"
fi
done
&& rm …
如果您不想删除存档文件,请删除该部分。
删除**/
第一行的部分,使其仅在当前目录中起作用,而不能在其子目录中起作用(然后该代码片段将在任何 shell 中工作)。
一些旧的tar
实现可能不支持-z
创建 gzip 存档;那么你就可以使用tar -cf "$x.tar" -- "$x.nef" "$x.xmp" && gzip -o "$x.tgz" -- "$x.tar" && rm …
.如果你不想删除文件,另一种可能是tar -cf - -- "$x.nef" "$x.xmp" | gzip >"$x.tgz"
(这种形式不能结合使用,&& rm
因为即使tar
命令失败它也会删除源文件)。