Рекурсивно искать файлы с определенным расширением

248

Я пытаюсь найти все файлы с определенным расширением в каталоге и его подкаталогах с помощью моего 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')

Что происходит здесь, где ошибка? Но эта фигурная скобка

  • 2
    Ошибка из-за пропущенного '{'
Теги:
recursion

7 ответов

493
find $directory -type f -name "*.in"

немного короче, чем все это (и безопаснее - имеет дело с пробелами в именах файлов и именах каталогов).

Вероятно, ваш script не подходит для записей, у которых нет имени . в имени, что делает $extension пустым.

  • 2
    Это тоже работает рекурсивно?
  • 12
    да, find является рекурсивным по умолчанию. вы можете ограничить глубины, если хотите (см. справочную страницу).
Показать ещё 14 комментариев
58
find {directory} -type f -name '*.extension'

Пример , чтобы найти все файлы csv в текущем каталоге

find . -type f -name '*.csv'
51

Синтаксис, который я использую, немного отличается от того, что предложил @Matt:

find $directory -type f -name \*.in

(это еще одно нажатие клавиши).

  • 1
    Сценарий Мэтта также не будет работать, если в текущем каталоге есть файл с расширением .in, а ваш будет работать. См. Stackoverflow.com/questions/5927369/…
  • 4
    @Snatsel этот комментарий (и, следовательно, ваш) совершенно неправильно.
Показать ещё 4 комментария
9

Без использования find:

du -a $directory | awk '{print $2}' | grep '\.in$'
  • 3
    grep самом деле не нужен здесь. awk имеет регулярные выражения и может ограничивать вывод значениями, соответствующими шаблону.
  • 0
    Этот метод чрезвычайно полезен, если вы проходите сотни терабайт. Команда поиска занимает слишком много времени для обработки. Это начинается немедленно.
Показать ещё 1 комментарий
9
  • Там { отсутствует browsefolders ()
  • Все $in должны быть $suffix
  • Строка с cut получает только среднюю часть front.middle.extension. Вы должны прочитать руководство по работе с оболочкой ${varname%%pattern} и друзей.

Я предполагаю, что вы выполняете это как упражнение в сценариях оболочки, в противном случае предлагаемое решение find - это путь.

Чтобы проверить правильность синтаксиса оболочки, без запуска script, используйте sh -n scriptname.

5

Чтобы найти все pom.xml файлы в вашем текущем каталоге и распечатать их, вы можете использовать:

find . -name 'pom.xml' -print
0
find $directory -type f -name "*.in"|grep $substring

Ещё вопросы

Сообщество Overcoder
Наверх
Меню