Показать несколько строк файлов * в каталоге в Linux - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь перечислить первые 5 строк всех файлов в каталоге (создание команды в Unix). Я пытаюсь решить эту проблему с помощью команды head, которая выглядит примерно так:

head -n 5 directory/*

Это работает с файлами, но выдает ошибку для каталогов (очевидно).

Итак, мой вопрос: как я могу применить команду head только к файлам?

Мой bash-скрипт выглядит примерно так:

#!/bin/bash
# description: show first/last lines of all the files in a provided directory

if [ $# -ne 3 ]
then
        echo "Error: Please provide 3 parameters."
        echo "Usage Example: lshead -head 5 [DIR]"
        exit
else
        operation=$1
        lines=$2
        directory=$3

        if [ "$operation" == "-head" ]
        then
                head -n $lines  $directory/*
        elif [ "$operation" == "-tail" ]
        then
                tail -n $lines $directory/*
        fi
fi

Любые предложения очень ценятся и большое спасибо в ожидании.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

это должно работать

#!/bin/bash
...
for f in "$directory"/{*,.??*}
do
    if [ -f "$f" ]
    then
      case "$operation" in head|tail)
          echo "$directory/$f:"
          $operation -n "$lines" "$f"
      esac
    fi
done
0 голосов
/ 09 ноября 2018

Вы можете использовать команду test для проверки типа файла (обычный файл, каталог ...)

if test -f filename и выполнять операцию только тогда, когда результат if равен true

    #!/bin/bash
# description: show first/last lines of all the files in a provided directory

if [ $# -ne 3 ]
then
        echo "Error: Please provide 3 parameters."
        echo "Usage Example: lshead -head 5 [DIR]"
        exit
else
        operation=$1
        lines=$2
        directory=$3

        if [ "$operation" == "-head" ]
        then
                for f in $(ls $directory)
                do

                if test -f "$directory/$f"
                then
                   echo "head $directory/$f:"
                   head -n $lines  $directory/$f
                fi
        done
        elif [ "$operation" == "-tail" ]
        then
        for f in $(ls $directory)
                do

                if test -f "$directory/$f"
                then
                   echo "tail $directory/$f:"
                   tail -n $lines  $directory/$f
                fi
                done
        fi
fi
0 голосов
/ 09 ноября 2018

вы можете использовать команду find для этого. Вы фильтруете файл на одном уровне и выполняете для каждой команды head:

$ find directory/ -maxdepth 1 -type f  -exec head -5 {} \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...