Unix:各フォルダの最初のN個のファイルのみを圧縮する方法は?

Unix:各フォルダの最初のN個のファイルのみを圧縮する方法は?

サブフォルダーを含む複数レベルの2 GBイメージを含むフォルダーがあります。

Ntarファイルに各(サブ)フォルダのファイルのみを保存したいと思います。findその時使ってみましたが、うまくtailいきtarませんでした。私が試したことは次のとおりです(仮説N = 10)。

find . | tail -n 10 | tar -czvf backup.tar.gz

...このエラーを出力します。

Cannot stat: File name too long

どうなりますか?考えてみてください。動作していても、10個のファイルではなく、すべてのフォルダの最初の10個のファイルだけを圧縮すると思います。フォルダ。

N各フォルダのファイルを取得するには? (書類注文は不要)

ベストアンサー1

paxこの-0オプションをサポートしている場合は、以下を使用してくださいzsh

print -rN dir/**/*(D/e:'reply=($REPLY/*(ND^/[1,10]))':) |
  pax -w0 | xz > file.tar.xz

これには、リスト内の各ディレクトリの最初の10個のディレクトリ以外のファイルがファイル名でソートされて含まれます。 glob修飾子を追加することで、別のソート順を選択できますomOmoLnon

標準コマンドがないかpaxサポートされていないが-0GNUコマンドがある場合は、tar次のことができます。

print -rN -- dir/**/*(D/e:'reply=($REPLY/*(ND^/[1,10]))':) |
  tar --null -T - -cjf file.tar.xz

その権限がないがzshアクセス権bash(GNUプロジェクトのシェル)がある場合は、次のことができます。

find dir -type d -exec bash -O nullglob -O dotglob -c '
  for dir do
    set -- "$dir/*"; n=0
    for file do
      if [ ! -d "$file" ] || [ -L "$file" ]; then
        printf "%s\0" "$file"
        (( n++ < 10 )) || break
      fi
    done
  done' bash {} + | pax -0w | xz > file.tar.xz

ただし、これにより効率が大幅に低下します。

おすすめ記事