一般的に私はUnixコマンドとパイプにもっと創造的ですが、今日はそうではありません。
だから私が持っているのはこれです:
collage.jpg
DCIM001.jpg
DCIM002.jpg
またはこれ:
001.jpg
002.jpg
boston-collage.jpg
または時々
panama-collage.jpg
DCIM001.jpg
DCIM002.jpg
このコマンドを使用すると、イメージが正しく整列されます。
find "Image Folder" -print0 | sort -z | tar cv --no-recursion --null -T -
しかし、*collage.*のファイルをソート結果の最初のファイルに変更して、そのリストで作成したtarアーカイブに最初に追加したいと思います。どんなアイデアがありますか?
答え1
最終的な目標がファイルを必要な順序でアーカイブに配置することである場合、簡単な解決策は最初にソートしたいファイルでアーカイブを作成し、最後にソートしたファイルを既存のアーカイブに追加することです。もちろん、これは複数のソートされたセグメントに一般化できます。これを行うには、アーカイブファイルを作成する必要があり、パイプラインのアーカイブに追加することはできません。
tar cf foo.tar /images/*collage.*
find /images ! -name '*collage.*' -print0 | sort -z | tar rf foo.tar --null -T -
デフォルトユーティリティを使用してカスタムソートを実行する場合は、可能な方法の1つは、エントリが属するグループを表す行にプレフィックスを追加することです。グループを並べ替える順序でプレフィックスラベルをソートし、プレフィックスを削除します。
find /images -print0 |
sed -z -e 's/.*collage\./1&/' -e 't' -e 's/^/2/' |
sort -z |
sed -z 's/^.//' |
tar …
別のアプローチは、カスタムソートを表現できる他の言語(Perl、Python、Rubyなど)でソートを実行することです。これにより、その言語でファイル名を収集するだけでなく、アーカイブの作成まで行うことができます。以下は、ソートのみを実行するPerlの例です。
perl -e '$,=$\="\0"; print sort {
$a =~ /collage\./ ? $b =~ /collage\./ ? $a cmp $b : 1 :
$b =~ /collage\./ ? -1 : $a cmp $b
} @ARGV' /images/* | tar …
一時的な書き換えによるソートの別の例(Perlコミュニティでは「Schwarztian変換」と呼ばれる):
perl -e '$,=$\="\0"; print
map {substr($_,1)}
sort
map {$_ = (/collage\./ ? "1" : "2") . $_}
@ARGV' /images/* | tar …
ファイル名の結合長がコマンドライン長制限を超えると、両方の例が失敗します。これを防ぐには、Perlにファイル名を生成させるようにしてください。
perl -e '$,=$\="\0"; print
map {substr($_,1)}
sort
map {$_ = (/collage\./ ? "1" : "2") . $_}
glob("/images/*")' /images/* | tar …
ファイル名を再帰的に生成する場合、または一部のフィルタリングを適用する必要がある場合は、次のものを使用できます。ファイル::検索。 Perlを使用してアーカイブを作成するには、次のものを使用できます。アーカイブ::タール。
答え2
私の提案は次のとおりです。一時ファイルを使用してください。
tmpdir=$(mktemp)
find "Image Folder" -print0 > $tmpdir/temp
{ grep -z collage $tempdir/temp | sort -z;
grep -z -v collage $tempdir/tmp | sort -z; } | \
tar cv --no-recursion --null -T -
rm -rf $tmpdir
「画像フォルダ」に入れない限り、より簡単な一時ファイルを使用できます。
find
このソリューションの基本的なアイデアは、forの結果を一時ファイルに保存してgrep
2つのsを実行できるようにし、grep
各結果を別々にソートしてからforのパイプラインに結合することですtar
。