ソートを使用すると、特定のファイルをどのように固定できますか?

ソートを使用すると、特定のファイルをどのように固定できますか?

一般的に私は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を使用してアーカイブを作成するには、次のものを使用できます。アーカイブ::タール

おすすめ記事