Я пытаюсь найти все файлы с определенным расширением в каталоге и его подкаталогах с помощью моего bash (последний выпуск Ubuntu LTS).
Это то, что написано в файле script:
#!/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"
К сожалению, когда я запускаю этот script в терминале, он говорит:
[: 29: in: unexpected operator
(с $extension
вместо 'in'
)
Что происходит здесь, где ошибка? Но эта фигурная скобка
find $directory -type f -name "*.in"
немного короче, чем все это (и безопаснее - имеет дело с пробелами в именах файлов и именах каталогов).
Вероятно, ваш script не подходит для записей, у которых нет имени .
в имени, что делает $extension
пустым.
find
является рекурсивным по умолчанию. вы можете ограничить глубины, если хотите (см. справочную страницу).
find {directory} -type f -name '*.extension'
Пример , чтобы найти все файлы csv в текущем каталоге
find . -type f -name '*.csv'
Синтаксис, который я использую, немного отличается от того, что предложил @Matt:
find $directory -type f -name \*.in
(это еще одно нажатие клавиши).
Без использования find
:
du -a $directory | awk '{print $2}' | grep '\.in$'
grep
самом деле не нужен здесь. awk
имеет регулярные выражения и может ограничивать вывод значениями, соответствующими шаблону.
{
отсутствует browsefolders ()
$in
должны быть $suffix
cut
получает только среднюю часть front.middle.extension
. Вы должны прочитать руководство по работе с оболочкой ${varname%%pattern}
и друзей.Я предполагаю, что вы выполняете это как упражнение в сценариях оболочки, в противном случае предлагаемое решение find
- это путь.
Чтобы проверить правильность синтаксиса оболочки, без запуска script, используйте sh -n scriptname
.
Чтобы найти все pom.xml
файлы в вашем текущем каталоге и распечатать их, вы можете использовать:
find . -name 'pom.xml' -print
find $directory -type f -name "*.in"|grep $substring