ls
プロセスオーバーライドを使用してファイルリスト(たとえば、またはで作成されたものfind
)を特定のアプリケーションで開いて表示または表示したいと思います。これらのリストをパイプすることはxargs
スクリプトまたはバイナリに対して機能しますが、xargs
オブジェクトがシェルエイリアスの場合は失敗します。このサイトに関するその他の質問。 [私が念頭に置いている具体的なアプリケーションは次のとおりですfeh
。]
xargs
bashエイリアスのこの制限を考慮して代わりに使用してみました。[script/binary/alias] <(find . -iname '*')
この設定はすべて望ましい効果を生成しますが、入力(ファイルパスリスト)が代わりに開く/表示するためのアプリケーション(たとえば、.ステートメントの前に入力リダイレクト演算子を追加しても問題は軽減されません(たとえば、他のコマンドの場合とは異なります)。cat
less
<
feh
gimp
feh
feh: No loadable images specified.
less
したがって、私の質問は、指定された目的(たとえば、ファイルリストを開く)にプロセス置換を使用できるかどうか、そうであれば適切な構文が何であるかについてです。 bashエイリアスとの互換性のための特定の要件(~/.bash_aliases
または同様の設定ファイルで指定)
ベストアンサー1
コマンドがパイプを介して内容を読み取るのではなく、複数のファイルを引数として受け入れる場合、単純なコマンド置換が機能します。
[script/binary/alias] $(find .)
あるいは、コマンドが一度に1つのファイルしか許可しない場合は、forループがトリックを実行する必要があります。
for file in $(find .); do [script/binary/alias] "$file"; done
どちらの場合も、スペース、タブ、改行、ワイルドカードを含むファイル名は問題を引き起こす可能性があり、while / readループはそれを処理できます。
find . | while IFS= read -r file; do [script/binary/alias] "$file"; done
改行文字を含むファイル名は依然として問題を引き起こす可能性があります。find
0 で区切られた出力で問題が解決されます (この場合bash
、zsh
、 と仮定ksh
)。
find . -print0 | while IFS= read -rd '' file; do [script/binary/alias] "$file"; done
これらの例ではすべて、find . -type f
通常のファイルのみを処理したい場合はより適切です。