Faz um loop pelos arquivos em cada subdiretório e aplica uma condição

0

Eu tenho diretório contém muitos subdiretórios e cada subdiretório tem um par de arquivos (interessado apenas em arquivos com extensão .ar). Agora, eu preciso percorrer cada subdiretório e verificar, por exemplo, se o número de arquivos = 4 faz algo com esses arquivos, volte para o segundo subdiretório, verifique os arquivos se = 3 e, em seguida, execute outro comando neles. Note que eu tenho condições muito complicadas para aplicar na declaração if.

algo parecido com isso

dir=$1

for sub_dir in $dir; do
    if the number of files in $sub_dir = 4; then
        do something or command line 
    if the number of files in $sub_dir = 3; then
       do another command
    if the number of files in $sub_dir < 3; then
    escape them

    fi
done

Eu preciso de um modelo para um processo semelhante.

    
por abubakr yagob 29.03.2018 / 00:58

2 respostas

2

Supondo que os subdiretórios estão localizados diretamente sob o diretório principal:

#!/bin/sh

topdir="$1"

for dir in "$topdir"/*/; do
    set -- "$dir"/*.ar

    if [ "$#" -eq 1 ] && [ ! -f "$1" ]; then
        # do things when no files were found
        # "$1" will be the pattern "$dir"/*.ar with * unexpanded
    elif [ "$#" -lt 3 ]; then
        # do things when less than 3 files were found
        # the filenames are in "$@"        
    elif [ "$#" -eq 3 ]; then
        # do things when 3 files were found
    elif [ "$#" -eq 4 ]; then
        # do things when 4 files were found
    else
        # do things when more than 4 files were found
    fi
done

Ou usando case :

#!/bin/sh

topdir="$1"

for dir in "$topdir"/*/; do
    set -- "$dir"/*.ar

    if [ "$#" -eq 1 ] && [ ! -f "$1" ]; then
        # no files found
    fi

    case "$#" in
        [12])
            # less than 3 files found
            ;;
        3)
            # 3 files found
            ;;
        4)
            # 4 files found
            ;;
        *)
            # more than 4 files found
    esac
done

As ramificações do código que precisa do nome do arquivo usa "$@" para se referir a todos os nomes de arquivos em um subdiretório ou "$1" , "$2" etc. para se referir aos arquivos individuais. Os nomes dos arquivos serão nomes de caminho, incluindo o diretório $topdir no início.

    
por 29.03.2018 / 07:11
1

Você pode fazer algo assim:

dir=$1

subdirectories = $(find $dir -type d) # find only subdirectories in dir

for subdir in $subdirectories
do
   n_files=$(find $subdir -maxdepth 1 -type f | wc -l) # find ordinary files in subdir and get it quantity

   if [ $n_files -eq 4 ]
   then
      do_something_4
   fi

   if [ $n_files -eq 3 ]
   then
      do_something_3
   fi

   if [ $n_files -lt 3 ]
   then
      do_something_else
   fi
done 
    
por 29.03.2018 / 01:49