Заставить `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"'. Поскольку вы используете одинарные кавычки, строка представляет собой буквальные четыре символа,двойные кавычки доллар номер один двойные кавычки.

Однако даже если вы поменяете местами двойные и одинарные кавычки, -name "'$1'"в вашей строке все равно останутся одинарные кавычки. Так что если $1это так, dogвы попытаетесь сопоставить строку из пяти символов 'dog'.

Если вы ищете соответствующие файлы *.py, то ваш скрипт настроен правильно $1, но вы хотите использовать это выражение следующим образом:

find . -name "$1" -print0

Связанный контент