*.lsf
現在のコンテンツを見つけてファイルの検索をすべて/subdirectories
実行する予定です。bsub<*.lsf
私は試した:
find ./ -type f -name "*.lsf" -exec bsub < \;
この部分はfind ./ -type f -name "*.lsf"
うまくいきます。しかし、実装に問題がありました。
この質問に答えるのに役立つ人はいますか?
答え1
最初の試みでほぼ成功しました。あなたがすべきことは、シェルを呼び出して<
リダイレクト演算子を解決することです。
find -name '*.lsf' -exec bash -c 'bsub <"$1"' _ {} \;
ただし、一致するファイルごとにシェルを起動するので、これは非常に効率的ではありません。できるだけ少数のシェル呼び出しを実行し、ループを使用して複数のファイルを一度に処理します。
find -name '*.lsf' -exec bash -c 'for i in "$@"; do bsub <"$i"; done' _ {} +
どちらもファイル名は安全です(つまり、ファイル名のスペースと非印刷/半印刷文字を処理します)。
答え2
次のように作業できますxargs
。
find ./ -type f -name "*.lsf" | xargs bsub
実際には、穴を次のように減らすことができます。
find *.lsf | xargs bsub
説明:私が使用しているクラスターでテストされました。
編集:文字列置換オプションと文字リダイレクトを削除しました。
答え3
xargs
効率的な方法で活用してみてください。 (@KamilMaciorowskiが言ったように、これは安全ではありません。)
find . -type f -iname "*.lsf" | xargs -I {} bash -c 'cat < {}'
次に、ファイル名のスペースなどを修正します。
find . -type f -iname "*.lsf" -print0 | xargs -0 -I {} bash -c 'cat < {}'
私はそれをテストしましたcat
。あなたはあなたの命令に置き換える必要があります