シェルスクリプトで `find` を動作させる

シェルスクリプトで `find` を動作させる

これは非常に簡単な作業であるように思われるので、何か簡単なことを見落としているのではないかと思いますが、うまくいかず、フォーラムでも何も見つからないようです。

シェル スクリプト内から実行しようとしていますfindが、何も実行されません。

たとえば、いくつかのファイルと、ファイルを含むいくつかのサブディレクトリを含むフォルダーがあります。

$ ls *
afile1.txt  anotherfile.py  findit.sh

subdir1:
morefiles1.txt  morefiles2.txt  morefiles3.txt  somescript.py

subdir2:
evenmorefiles1.txt  evenmorefiles2.py  evenmorefiles2.sh

find を使用して、指定された検索文字列を持つすべてのファイル名を抽出したいのですが (最終的には にパイプしますxargs)、まったく同じコマンドがコマンド ラインからは機能するのに、シェル スクリプト内からは機能しない理由がわかりません。

$ cat findit.sh 
#!/bin/bash
echo $(which find)
echo "find . -name '"$1"' -print0"
find . -name '"$1"' -print0
echo "nothin??"
$ . findit.sh '*py'
/usr/bin/find
find . -name '*py' -print0
nothin??
$ find . -name '*py' -print0
./anotherfile.py./subdir2/evenmorefiles2.py./subdir1/somescript.py

この点に関してはどんなご助力でもいただければ幸いです...

答え1

二重引用符で囲んでいます-name '"$1"'。一重引用符を使用しているため、文字列は4文字のリテラルになります。二重引用符 ドル 数字 1 二重引用符

ただし、二重引用符と一重引用符を入れ替えても、-name "'$1'"文字列には一重引用符が残ります。そのため、$1の場合はdog5 文字の文字列を一致させようとすることになります'dog'

一致するファイルを探している場合、*.pyスクリプトは正しく設定されています$1が、次のようにその式を使用する必要があります。

find . -name "$1" -print0

関連情報