検索:スラッシュの特別な処理

検索:スラッシュの特別な処理

パスを一致させるために使用したいのですが、find次のことがわかりました。

-path pattern

ファイル名はシェルパターンと一致します。メタ文字は/' or特に処理されません。たとえば、次のようになります。

  find . -path "./sr*sc"

./src/misc名前付きディレクトリ(存在する場合)のエントリが印刷されます。

現在のディレクトリのファイルのみを一致させるにはどうすればよいですか?タスクを実行するには別のツールが必要ですか?

編集する。提案されているように、いくつかの詳細は次のとおりです。タスクを完了するには、以下が-maxdepthあります-regex。ただし、実際のアプリケーションでは、パスは単純な定数ではなく変数である可能性があり、これは-maxdepth正しく機能せず、-regex過剰に見えることがあります。それで、スラッシュを尊重する簡単な解決策があるのだろうかfind。以下は、その動作を説明するrsyncドキュメントです。これは私が望むものに非常に近いです。

現在の最良の解決策は正規表現を使用することです。しかし、正規表現をより簡単にする方法を知っていれば大歓迎です。


私が望むものの例として、以下はrsyncパターンルールです。

  • '*' はすべてのパスコンポーネントと一致しますが、スラッシュで停止します。

  • スラッシュを含む何でも一致させるには、「**」を使用します。

答え1

代わりに使用してください-regex。パターンは始まりと終わりが決まっているので始まりと.*終わりに活用すればいいようです。一致しない地球を交換するために使用されます[^/]*/。たとえば、*/

-regex '.*/sr[^/]*sc.*'

小さなPerlスクリプトがあります2パールを探すコマンドの引数をfind同等のPerlスクリプトに変換すると主張します。明らかに、これは-pathasと同じパターンマッチングを持ちますが、find他の引数(たとえば-glob、システムコールを使用してfnmatch()必要な種類のワイルドカードを指定)を許可するように編集できます。find2perlこのパッチに示すように、私のバージョンをすばやく修正しました。

--- /usr/bin/find2perl  2016-02-04 19:28:48.000000000 +0100
+++ /tmp/find2perl      2018-07-31 20:38:10.034175198 +0200
@@ -58,2 +58,4 @@
     $out .= tab . '$File::Find::name =~ /' . fileglob_to_re(shift) . "/s$1";
+    } elsif (/^glob$/) {
+        $out .= tab . 'fnmatch("'.(shift).'", $name, FNM_PATHNAME|FNM_PERIOD)';
 } elsif ($_ eq 'perm') {
@@ -236,2 +238,3 @@
 use File::Find ();
+use File::FnMatch qw(:fnmatch);    # import everything

(最初の行には、+私が追加した3行が表示されます。)Fedora用のperl-App-find2perlパッケージを追加する必要がありますperl-File-FnMatch。システムでそれに対応する項目を見つける必要があります。

その後、次のコマンドを実行できます。

/tmp/find2perl . -glob './sr*sc' | perl

答え2

findサブディレクトリへの再帰を防ぐには、-maxdepthフラグを使用します。

find -maxdepth 1 -name "sr*sc"

答え3

などの一部のシェルは、zshファイル名のグロービングパターンをサポートしています。デフォルトでは有効になっているため、必ず有効にして使用する必要があります。bashksh93**zshbashshopt -s globstarksh93set -o globstar

つまり、次のことができるはずです。

for pathname in ./src/**/misc/*.c
    # process "$pathname" here
done

たとえば、いくつかのfind同様のテストを-type f簡単に統合できます。

for pathname in ./src/**/misc/*.c
    [ -f "$pathname" ] || continue  # will not skip symbolic links to regular files though
    # process "$pathname" here
done

関連情報