Findは特定のレベルで*.shを探したくありません。

Findは特定のレベルで*.shを探したくありません。

質問がありますfind。特定のディレクトリレベルにある場合は、* .shファイルが見つかりません。ただし、*.sql ファイルは検索します。

/path$ cd do_not_upload/updates/1.1.1/
/path/do_not_upload/updates/1.1.1$ find . -path *.sh
./run_pre_update/002.sh
./run_pre_update/001.sh
./run_post_update/001.sh
/path/do_not_upload/updates/1.1.1$ find . -path *.sh
./run_pre_update/002.sh
./run_pre_update/001.sh
./run_post_update/001.sh
/path/do_not_upload/updates/1.1.1$ cd ..
/path/do_not_upload/updates$ find . -path *.sh
./1.1.3/run_pre_update/002.sh
./1.1.3/run_pre_update/001.sh
./1.1.3/run_post_update/001.sh
./1.1.1/run_pre_update/002.sh
./1.1.1/run_pre_update/001.sh
./1.1.1/run_post_update/001.sh
/path/do_not_upload/updates$ cd ..
/path/do_not_upload$ find . -path *.sh
./updates/1.1.3/run_pre_update/002.sh
./updates/1.1.3/run_pre_update/001.sh
./updates/1.1.3/run_post_update/001.sh
./updates/1.1.1/run_pre_update/002.sh
./updates/1.1.1/run_pre_update/001.sh
./updates/1.1.1/run_post_update/001.sh
/path/do_not_upload$ cd ..
/path$ find . -path *.sh
/path$ find . -path *.sql
./do_not_upload/updates/1.1.3/sql_migrations/002.sql
./do_not_upload/updates/1.1.3/sql_migrations/001.sql
./do_not_upload/updates/1.1.1/sql_migrations/002.sql
./do_not_upload/updates/1.1.1/sql_migrations/001.sql

$ find --version
find (GNU findutils) 4.4.2

/path$ stat do_not_upload/
  File: ‘do_not_upload/’
  Size: 60          Blocks: 0          IO Block: 4096   directory
Device: 14h/20d Inode: 159862      Links: 3
Access: (0775/drwxrwxr-x)  Uid: ( 1000/  jorgee)   Gid: ( 1000/  jorgee)
Access: 2014-09-10 14:02:34.449376973 -0300
Modify: 2014-09-10 13:54:13.805363567 -0300
Change: 2014-09-10 13:54:13.805363567 -0300
 Birth: -

答え1

Unixシリーズシステムでは、*.shシェルによって拡張されたglob式で、結果が呼び出し元プログラムに引数として渡されます。一致するファイルがない場合にのみ、glob式は変更されずに渡されます。実行中のプログラムにワイルドカード文字を渡すには、ワイルドカード文字を引用する習慣が必要です。

find . -path *.shたとえば、 で実行する場合、/path/do_not_upload/updates/1.1.1/run_pre_update/実際に実行されるコマンドは になりますfind . -path 001.sh 002.sh。これはあなたが望むものはほとんどわかりません。

これは、呼び出されたプログラムによってグローバル拡張が実行または実行されないMS-DOSおよび関連システムとは異なることに注意してください。

シェルの拡張を防ぐには、引数を二重引用符または一重引用符で囲みます。これにより、引数が呼び出しプログラムにそのまま渡され、find自己拡張が可能になります。

$ find . -path '*.sh'

答え2

ほとんど重複です。この問題が、出力にならない理由は少し異なります。

の場合、-path引数はフルパス(コマンドライン引数を含む)と一致する必要があります。foo.sh現在のディレクトリに存在する場合は実行中です。

find . -path foo.sh

foo.sh一致するものがないため、出力は./foo.shありません。

解決策はリンクされた質問と同じです。シェルが拡張したくない場合は、ワイルドカードを引用してください。

関連情報