私はカメラで編集された画像の大規模なアーカイブを持っていますが、各画像は実際には*.nefファイルと*.xmpファイルのペアです。すべてのフォルダに移動し、ペアを単一のtgzファイルに圧縮したいと思います。
ディレクトリ内の各ファイル名は一意であるため、ls *.nef
コマンド出力からファイル名を移動するだけで十分です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 …
アーカイブファイルを削除したくない場合は、このセクションを削除してください。
**/
サブディレクトリではなく現在のディレクトリでのみ機能するように、最初の行の一部を削除します。これにより、コードスニペットがすべてのシェルで機能します。
いくつかの以前の実装では、gzipアーカイブの生成をサポートしていない可能性tar
があります。別の可能性は、ファイルを削除しない場合です(この形式は、コマンドが失敗してもソースファイルを削除するため、一緒に使用することはできません)。-z
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