BASH проверить, заканчивается ли имя файла на .dylib - PullRequest
1 голос
/ 06 апреля 2020

Я хожу по дереву файлов, чтобы идентифицировать все файлы .DYLIB.

#!/bin/bash

#script to recursively travel a dir of n levels

function traverse() {
for file in "$1"/*
do
    if [ ! -d "${file}" ] ; then
        echo "${file} is a file"
    else
        echo "entering recursion with: ${file}"
        traverse "${file}"
    fi
done
}

function main() {
    traverse "$1"
}

main "$1"

Я хочу проверить, заканчивается ли имя файла на .DYLIB, прежде чем печатать "... это файл". Я думаю, что мне может понадобиться добавить к условию "if [! -D" $ {file} "]; затем", но я не уверен. Есть ли способ сделать это в bash?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Нет необходимости писать собственную рекурсивную функцию. Вы можете рекурсивно найти все *.dylib файлы, используя ** glob:

shopt -s globstar
ls "$1"/**/*.dylib

или использовать find:

find "$1" -name '*.dylib'

Чтобы использовать эти результаты, я рекомендую зацикливать их напрямую , Это позволяет избежать использования памяти временным массивом.

shopt -s globstar

for file in "$1"/**/*.dylib; do
    echo "$file"
done

или

while IFS= read -rd '' file; do 
    echo "$file"
done < <(find "$1" -name '*.dylib')

Есть ли способ сохранить все в массив строк, чтобы я может выполнить операцию с этими файлами .dylib?

Но если вам действительно нужен массив, вы можете написать:

shopt -s globstar
files=("$1"/**/*.dylib)

или

readarray -td '' files < <(find "$1" -name '*.dylib')

Затем к l oop над массивом вы напишите:

for file in "${files[@]}"; do
    echo "$file"
done
2 голосов
/ 06 апреля 2020

Не добавляйте к условию в if [ ! -d "$file" ], потому что тогда блок else попытается преобразовать в файлы без суффикса. Но рекурсия должна быть только для каталогов.

Вы должны добавить для этого вложенное условие. Вы можете использовать bash оператор условия [[ ]], чтобы = выполнял сопоставление с подстановочными знаками.

if [ ! -d "${file}" ] ; then
    if [[ "$file" = *.DYLIB ]]; then 
        echo "${file} is a file"
    fi
else
    echo "entering recursion with: ${file}"
    traverse "${file}"
fi

Или вы можете инвертировать смысл проверки каталога:

if [ -d "$file" ]; then
    echo "entering recursion with: ${file}"
    traverse "${file}"
elif [ "$file" = *.DYLIB ]; then
    echo "$file is a file"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...