9

なぜこれが機能しないのですか?

find . -maxdepth 1 -type f -print0 | xargs -0 .

私が得るのはすべてですxargs: .: Permission denied

4

2 に答える 2

17

を実行する. fileと、シェルビルトインが呼び出されます.xargsバリアントは現在のディレクトリを実行しようとします。
それがビルトインを呼び出したとしても、そのコマンドはサブシェルで実行されるため、すべての「ソーシング」は役に立たないでしょう。

そのためにシェルグロブとループを使用します。

for file in * ; do
  if [ -f "$file" ] ; then
    . "$file"
  fi
done
于 2012-09-14T14:35:58.017 に答える
1

@Matのソリューションは最もクリーンですが、楽しみのためにbash-fuに興味がある場合は、元のコマンドに基づく次のソリューションfindも機能します。

eval $(find . -maxdepth 1 -type f -exec echo . \'{}\'';' \;)
  • find-execは、見つかった各ファイルのソーシング コマンドを構築するために使用されます. './foo';。ファイル名に特殊文字が含まれていることを確認するために、エスケープされた一重引用符に注意してください。適切に処理されます。
  • findソース コマンドの改行区切りのリストを返します。二重引用符を付けずにコマンド置換 ( $())を使用すると、シェルはこれらの行を区切り文字としてそれぞれスペースを使用して 1 行に折り畳みます。
  • 最後にeval、現在のシェルのコンテキストでソーシング コマンドの完全なリストを実行します (OS X 10.8.1 で検証済み)。

注: このソリューションの潜在的な問題の 1 つは、多数のファイルや長いファイル名が存在する場合、コマンド文字列が大きくなる可能性があることです。

于 2012-09-14T17:39:04.937 に答える