パスを一致させるために使用したいのですが、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スクリプトに変換すると主張します。明らかに、これは-path
asと同じパターンマッチングを持ちますが、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
ファイル名のグロービングパターンをサポートしています。デフォルトでは有効になっているため、必ず有効にして使用する必要があります。bash
ksh93
**
zsh
bash
shopt -s globstar
ksh93
set -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