ディレクトリの最初のいくつかのファイルを繰り返すには?

ディレクトリの最初のいくつかのファイルを繰り返すには?

私は現在、次のzsh-snippetを使用してさらなる処理のために小さなファイルバッチを選択しています。

for f in $(ls /some/path/*.txt | head -2) ; do
  echo unpacking $f
  ./prepare.sh $f && rm -v $f
done

$(ls ... | head -2)zshよりも良い選択肢がありますか?

私の使命の一般的な概要です。ニューラルネットワークを訓練するためのデータセットを作成しています。ここでは、機械学習タスクの詳細は重要ではありません。データセット作成操作を実行するには、多数のファイルを手動で処理する必要がありました。そのために、私はそれらを別のディレクトリにコピーしました。次に、いくつかのファイル(この例の出力から最初の2つls)をランダムに選択し、いくつかの前処理ルーチンを呼び出し、結果を確認し、そのいくつかを生成中のデータセットに移動し、残りを削除します。 。クリーニング後、上記のコマンドを再実行しました。

また、シェルプログラミング技術を向上させ、新しいことを学びたいです:)

これらの「最初の」ファイルが選択される順序は重要ではありません。結局、すべてのファイルが処理されるからです。

言い換えれば、私はforループ内でPCを使用して作業しており、数回の繰り返しの後にPCが一時停止して待機したいと思います。

擬似コード。

for f in /some/path/*.txt ; do
  echo unpacking $f
  ./prepare $f
  
  if human wants to review ; then
     human is reviewing then cleans, and PC waits
  fi
done

この奇妙なプロセスが発生する理由は、1つ.txtの「ソース」ファイルを前処理すると数十の異なるファイルが生成され、そのすべてのファイルを見て、ネットワークトレーニングに適したいくつかのサンプル(通常1-2)を選択する必要があるためです。 。

実行できますが、for f in /some/path/*.txt ; do ./prepare $f ; doneこのコマンドは何百ものファイルを生成します。これは圧倒的です。

ベストアンサー1

グローバル予選

Glob修飾子は、ほとんどのファイル使用lsまたはfind列挙ファイルを置き換えることができます。これはzshのユニークな機能です。

たとえば、(事前の順序でファイルを列挙し、最初の2つのファイルのみを保持)はzshの1$(ls /some/path/*.txt | head -2)に等しくなります。修飾子は、一致がない場合はリストが空であることを確認し、修飾子は一致を指定された範囲に制限します。/some/path/*.txt(N[1,2])N[from,to]

修飾子がない場合、Nデフォルトオプションで一致するファイルがない場合は、エラーメッセージとともにスクリプトが終了します。

oまたは、O修飾子を使用してファイルの順序を制御することもできます。たとえば、/some/path/*.txt(Nom[1,2])2 つの最新のファイルをインポートします。

1 には通常 zsh に有利なわずかな違いがあります。空白や改行文字、無効なバイトシーケンスなどの特殊文字を含むファイル名で問題が発生する傾向がありますが、lszshの組み込み機能はすべてのファイル名で確実に機能します。極端なケースでは、エラー管理が異なります。ここでオプションを忘れたため、-dこれらのファイルの一部が次の種類の場合lsでも問題が発生します。*.txt目次ls内容も一覧表示されます。


しかし、両方のファイルをインポートすることが全体的な目標を達成するのにどのように役立つのかわかりません。すべてのファイルを処理するが、人々が最初の数個のファイルだけを表示できるようにする方法が必要な場合は、ステップ/続行/中断プロンプトを表示できます。このような:

pause=1
for f in /some/path/*.txt ; do
  print -ru2 unpacking $f
  ./prepare $f
  
  if ((pause)); then
    print -ru2 -- "$f output is ready for review."
    c=
    while [[ $c != [anq] ]]; do
      read -k1 "c?Process (N)ext, (A)ll, (Q)uit? " && c=${c:l}
    done
    echo
    case $c in
      a) pause=0;;
      q) break;;
    esac
  fi
done

おすすめ記事