LINUX.ORG.RU

Создание скрипта на bash для обхода директорий

 ,


0

1

Добрый вечер, мне необходимо создать скрипт на bash, который должен вывести в заданной директории названия файлов, их объем, дату создания, тип файла. Так же он должен быть рекурсивным, и пройти все папки, которые находятся внутри заданной директории. Пусть я должен сам указать. Я новичок в этом деле, так что ваши комментарии приветствуются!

Можно в одну команду уложиться, но думать лень.

Комбинируй find $folder -type f с ls -lh и file (покажет тип файла).

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

find temp/ -type f -exec bash -c 'ls -lh {}; file {}' \;

(думать не стал, дошёл до компа, нашёл шпаргалку)

Параметры ls подбери под свои конкретные нужды, можешь ещё воспользоваться stat, а сделать красивый вывод тебе помогут cat, sed и printf.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 2)
Ответ на: комментарий от kardapoltsev

Возможно, расширение. Можно сделать подсветку с помощью case.

Dog ★★★
()
Ответ на: комментарий от WitcherGeralt

find умеет принимать два и более -exec разом, нет нужды каждый раз запускать bash: find temp/ -type f -exec ls -lh {} \; -exec file {} \;

Siborgium ★★★★★
()
Ответ на: комментарий от kardapoltsev

Честно - я не знаю, вероятно через file узнать. Главное условие - мне необходимо создать цикл. В целом я нашел похожий код и его отредачил, сейчас буду заниматься его совершенствованием. #!/bin/bash path=$1 parent_dir=$path loop_folder_recurse() { local files_list="" local cnt=0 for i in «$1»/*;do if [ -d «$i» ];then echo «dir: $i» parent_dir=$i echo before recursion loop_folder_recurse «$i» echo after recursion elif [ -f «$i» ]; then echo file $i if [ $cur_fol != $main_pwd ]; then file_list+=$i’\n’ cnt=$((cnt + 1)) fi fi done } echo «Base path: $path» loop_folder_recurse $path

Как я понял - мне нужно добавить даже ls -go и file, чтобы получить искомый результат

gkanonimus
() автор топика
Ответ на: комментарий от gkanonimus
path=$1
parent_dir=$path
loop_folder_recurse() {
    local files_list=""
    local cnt=0
    for i in "$1"/*;do
        if [ -d "$i" ];then
            echo "dir: $i"
            parent_dir=$i
            echo before recursion
            loop_folder_recurse "$i"
            echo after recursion
        elif [ -f "$i" ]; then
            echo file $i
            if [ $cur_fol != $main_pwd ]; then
                file_list+=$i'\n'
                cnt=$((cnt + 1))
            fi
        fi
    done
}
echo "Base path: $path"
loop_folder_recurse $path```
gkanonimus
() автор топика
Ответ на: комментарий от kardapoltsev

ТС, а что подразумевается под «тип файла»?

Кошерный/некошерный

Oberstserj ★★
()
Ответ на: комментарий от gkanonimus

Главное условие - мне необходимо создать цикл.

Нее. Для обхода дерева нужна рекурсия. 🍿

А, так она у тебя уже есть. Хорошо.

pinus_nigra
()
Последнее исправление: pinus_nigra (всего исправлений: 1)
Ответ на: комментарий от pinus_nigra

Отредактировал код, получилось так

#!/bin/bash
path=$1
parent_dir=$path
loop_folder_recurse() {
    local files_list=""
    local cnt=0
    for i in "$1"/*;do
        if [ -d "$i" ];then
            echo "dir: $i"
            parent_dir=$i
            echo before recursion
            loop_folder_recurse "$i"
            echo after recursion
        elif [ -f "$i" ]; then
            echo file $1
            if [ $cur_fol != $main_pwd ]; then
		ls -go $i
                file $i
                file_list+=$i'\n'
                cnt=$((cnt + 1))
            fi
        fi
    done
}
echo "Base path: $path"
loop_folder_recurse $path

Выводит всё адекватн

gkanonimus
() автор топика
Ответ на: комментарий от wandrien

Мне нужен был зачем-то счётчик, но я так его и не использовал, так что убрал этот рудимент когда, спасибо

gkanonimus
() автор топика
Ответ на: комментарий от gkanonimus
echo file $1

Здесь опечатка.

Должно быть $i вместо $1.

И кавычки много где забыл. На именах с пробелами обломаешься.

Условие $cur_fol != $main_pwd не используется. Переменные cnt и file_list не используются. parent_dir не используется.

Короче, я выкинул всё лишнее:

#!/bin/bash
path="$1"
loop_folder_recurse() {
    for i in "$1"/*;do
        if [ -d "$i" ];then
            echo "dir: $i"
            loop_folder_recurse "$i"
        elif [ -f "$i" ]; then
            echo file "$i"
            ls -go "$i"
            file "$i"
        fi
    done
}
echo "Base path: $path"
loop_folder_recurse "$path"
wandrien ★★
()

Кстати если тип файла нужен не в виде описания, а в виде MIME-типа, то можно вызвать с ключом file --mime.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Спасибо вам большое, вы мне очень помогли! Код действительно стал гораздо короче, и воспринимать его стало легче, теперь не так теряюсь

gkanonimus
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.