
Думаю, я упускаю из виду что-то простое, так как это кажется очень простой задачей, но я не могу ничего найти на форумах.
Я пытаюсь запустить 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