содержимому - поиск скрытых файлов linux



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

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

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

https://src-bin.com


Answer #1
  1. Существует { отсутствует после browsefolders ()
  2. Все $in должны быть $suffix
  3. Линия с cut дает вам только среднюю часть front.middle.extension . Вы должны прочитать руководство по оболочке в ${varname%%pattern} и друзьях.

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

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


Answer #2

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

du -a $directory | awk '{print $2}' | grep '\.in$'

Answer #3

Хотя использование команды find может быть полезно здесь, сама оболочка предоставляет варианты для достижения этого требования без каких-либо сторонних инструментов. Оболочка bash предоставляет расширенную опцию поддержки glob, с помощью которой вы можете получить имена файлов по рекурсивным путям, которые соответствуют требуемым расширениям.

Расширенным вариантом является extglob который необходимо установить с shopt опции shopt как shopt ниже. Параметры включены с поддержкой -s и отключены с флагом -u . Кроме того, вы можете использовать несколько опций, т. nullglob в котором nullglob полностью сметен, заменен набором нулевых слов. И globstar который позволяет globstar все каталоги

shopt -s extglob nullglob globstar

Теперь все, что вам нужно сделать, это сформировать выражение glob, чтобы включить файлы определенного расширения, которые вы можете сделать, как показано ниже. Мы используем массив для заполнения результатов glob, потому что при правильном и расширенном цитировании имена файлов со специальными символами останутся неповрежденными и не будут разбиты из-за разбиения слов на оболочку.

Например, чтобы перечислить все *.csv файлы в рекурсивных путях

fileList=(**/*.csv)

Опция ** заключается в том, чтобы перезаписывать через подпапки, а *.csv - расширение glob, включающее любой файл упомянутых расширений. Теперь для печати фактических файлов просто сделайте

printf '%s\n' "${fileList[@]}"

Использование массива и правильное цитированное расширение - это правильный способ использования в сценариях оболочки, но для интерактивного использования вы можете просто использовать ls с выражением glob как

ls -1 -- **/*.csv

Это вполне можно было бы расширить, чтобы соответствовать нескольким файлам, т.е. файлу, заканчивающемуся с помощью множественного расширения (т. Е. Похоже на добавление нескольких флагов в команду find ). Например, рассмотрим случай, когда нужно получить все рекурсивные файлы изображений, т. *.gif Расширений *.gif , *.png и *.jpg , все, что вам нужно, это

ls -1 -- **/+(*.jpg|*.gif|*.png)

Это вполне можно было бы расширить, чтобы также отрицать результаты. С тем же синтаксисом можно использовать результаты glob для исключения файлов определенного типа. Предположим, вы хотите исключить имена файлов с расширениями выше, вы можете сделать

excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"

Конструкция !() - операция отрицания, чтобы не включать какие-либо расширения файлов, перечисленные внутри, и | является оператором чередования, который используется в библиотеке расширенных регулярных выражений, чтобы выполнить совпадение OR с глобусами.

Обратите внимание, что эта расширенная поддержка glob недоступна в оболочке POSIX bourne и ее чисто специфической для последних версий bash . Поэтому, если вы рассматриваете переносимость скриптов, запущенных в оболочках POSIX и bash , этот параметр будет неправильным.


Answer #4

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

find . -name 'pom.xml' -print

Answer #5
find $directory -type f -name "*.in"|grep $substring

Answer #6
find {directory} -type f -name '*.extension'

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

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




recursion