質問があります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
ありません。
解決策はリンクされた質問と同じです。シェルが拡張したくない場合は、ワイルドカードを引用してください。