Я пытаюсь найти все файлы с определенным расширением в каталоге и его подкаталогах с помощью моего bash (последняя версия Ubuntu LTS).
Вот что написано в файле скрипта:
#!/bin/bash
directory="/home/flip/Desktop"
suffix="in"
browsefolders ()
for i in "$1"/*;
do
echo "dir :$directory"
echo "filename: $i"
# echo ${i#*.}
extension=`echo "$i" | cut -d'.' -f2`
echo "Erweiterung $extension"
if [ -f "$i" ]; then
if [ $extension == $suffix ]; then
echo "$i ends with $in"
else
echo "$i does NOT end with $in"
fi
elif [ -d "$i" ]; then
browsefolders "$i"
fi
done
}
browsefolders "$directory"
К сожалению, когда я запускаю этот скрипт в терминале, он говорит:
[: 29: in: unexpected operator
(с $extension
вместо 'in'
)
Что здесь происходит, где ошибка? Но эта фигурная скобка
Ответы:
немного короче всего этого (и безопаснее - имеет дело с пробелами в именах файлов и каталогов).
Возможно, ваш скрипт не работает для записей, которые не имеют
.
в своем имени, делая$extension
пустым.источник
find
по умолчанию рекурсивно Вы можете ограничить глубины, если хотите (см. справочную страницу).Пример: чтобы найти все
csv
файлы в текущем каталоге и его подкаталогах, используйте:источник
Синтаксис, который я использую, немного отличается от предложенного @Matt:
(это на одно нажатие клавиши меньше).
источник
Без использования
find
:источник
grep
этом нет необходимости.awk
имеет регулярные выражения и может ограничивать его вывод значениями, соответствующими шаблону.awk|grep
это анти-шаблон. Пусть awk сделает помойку.{
пропал послеbrowsefolders ()
$in
должно быть$suffix
cut
получит только среднюю частьfront.middle.extension
. Вы должны прочитать руководство по оболочке${varname%%pattern}
и друзей.Я предполагаю, что вы делаете это как упражнение в написании сценариев оболочки, в противном случае
find
уже предложенное решение - это путь.Для проверки правильности синтаксиса оболочки без запуска скрипта используйте
sh -n scriptname
.источник
источник
Хотя использование
find
команды здесь может быть полезным, сама оболочка предоставляет опции для выполнения этого требования без каких-либо сторонних инструментов.bash
Оболочка обеспечивает расширенный вариант поддержки Glob с помощью которой вы можете получить имена файлов при рекурсивных путях, матч с расширениями , которые вы хотите.Расширенная опция - это то,
extglob
что нужно установить, используяshopt
опцию, как показано ниже. Опции включены с-s
поддержкой и отключены с-u
флагом. Кроме того, вы можете использовать несколько опций, то есть,nullglob
когда непревзойденный глобус будет полностью удален, заменен набором нулевых слов. Иglobstar
это позволяет проходить через все каталогиТеперь все, что вам нужно сделать, это сформировать выражение glob для включения файлов определенного расширения, которые вы можете сделать, как показано ниже. Мы используем массив для заполнения результатов глоба, потому что при правильном цитировании и расширении имена файлов со специальными символами останутся нетронутыми и не сломаются из-за разбиения слов оболочкой.
Например, чтобы перечислить все
*.csv
файлы в рекурсивных путяхОпция
**
состоит в том, чтобы проходить по подпапкам и*.csv
расширять глобально, чтобы включить любой файл упомянутых расширений. Теперь для печати реальных файлов, просто сделайтеИспользование массива и правильное раскрытие в кавычках - правильный путь при использовании в сценариях оболочки, но для интерактивного использования вы можете просто использовать
ls
выражение glob какЭто вполне может быть расширено для соответствия нескольким файлам, т.е. файлам, заканчивающимся несколькими расширениями (то есть аналогично добавлению нескольких флагов в
find
команду) Например, рассмотрим случай получения всех файлов рекурсивных изображений, например расширений*.gif
,*.png
и*.jpg
все, что вам нужно, этоЭто вполне может быть расширено, чтобы иметь отрицательные результаты также. С тем же синтаксисом можно использовать результаты glob для исключения файлов определенного типа. Предположим, вы хотите исключить имена файлов с расширениями выше, вы можете сделать
Конструкция
!()
представляет собой операцию отрицания, которая не включает в себя ни одно из расширений файлов, перечисленных внутри, и|
является оператором чередования, аналогичным тому, который используется в библиотеке расширенных регулярных выражений для сопоставления ИЛИ глобанов.Обратите внимание, что эта расширенная поддержка glob недоступна в оболочке POSIX bourne и является чисто специфической для последних версий
bash
. Так что, если вы рассматриваете переносимость скриптов, работающих в POSIX иbash
оболочках, эта опция не будет правильной.источник
Чтобы найти все
pom.xml
файлы в вашем текущем каталоге и распечатать их, вы можете использовать:источник
источник
источник