Как зациклиться на папках, содержащих файлы с определенными расширениями?

Вы можете удалить заголовки из вывода ps, используя синтаксис =в конце имен столбцов, а затем передать результаты через awk, где вы попросите его найти позиции этих двух параметров. Найдя, сохраните совпадающие данные во временных переменных, а затем напечатайте нужные поля в конце :

.
ps -C apache2 -o pid=,user=,cmd= | awk '{
  match($0, "-Dwd.instance=[^ ]+");
  a=substr($0,RSTART,RLENGTH);
  match($0, "-Dcom.sun.management.jmxremote.port=[^ ]+");
  b=substr($0,RSTART,RLENGTH);
  print $1, $2, a, b
}' 

Функция matchищет те строки, которые вы идентифицировали, за которыми следует знак равенства -, за которым следует «один или несколько не -пустых символов», чтобы также получить значения параметров.

Учитывая, что ваш образец ввода (подделан для предоставления PID и пользовательского поля ), вывод будет:

4242 www -Dwd.instance=boxect0401a -Dcom.sun.management.jmxremote.port=56517
0
02.05.2020, 14:57
2 ответа

Это делает cdв подоболочке

#!/usr/bin/env bash

shopt -s nullglob

input_dir=$1
output_dir=$2

mkdir -p "$output_dir"

while IFS= read -rd '' dir; do
  files=("$dir"/*.mp3)
  if (( ${#files[*]} )); then
    ( 
     cd "$dir" || exit
     output_file=$output_dir/${PWD##*/}
     echo " Output: $output_file"
     echo sox --show-progress "${files[@]##*/} "$output_file"
    )
  fi 
done < <(find "$input_dir" -type d -print0)
  • Удалите echoперед sox, если вы считаете, что вывод правильный.
  • Я никогда раньше не использовал sox, чтобы вы знали.
1
28.04.2021, 23:16

Мы по-прежнему можем использовать findдля поиска всех каталогов, но цикл, который берет эти каталоги, должен будет проверять файлы MP3:

#!/bin/sh

indir=$1
outdir=$2

mkdir -p "$outdir" || exit 1

find "$indir" -type d -exec bash -O nullglob -c '
    outdir=$1; shift

    for dirpath do
        mp3files=( "$dirpath"/*.mp3 )
        [[ ${#mp3files[@]} -eq 0 ]] && continue

        printf -v outfile "%s - Track only.mp3" "${dirpath##*/}"

        sox --show-progress "${mp3files[@]}" "$outdir/$outfile"
    done' bash "$outdir" {} +

Этот /bin/shскрипт запускает find, а findзапускает короткий скрипт в -строке bash. Сценарий bashбудет вызываться с набором путей к каталогам, но первым аргументом будет путь к выходному каталогу. Это получено в outdirв сценарии bash, и этот аргумент сдвигается из списка позиционных параметров, оставляя только список путей к каталогам.

Затем строчный скрипт in -выполняет итерацию по этим каталогам и расширяет глобус *.mp3в каждом, получая список путей к файлам MP3, которые мы храним в массиве mp3files.

Поскольку мы используем -O nullglobдля этого скрипта, массив будет пустым, если нет совпадающих имен файлов, поэтому тест -eq 0используется для перехода к следующей итерации, если это так.

Затем мы создаем имя выходного файла из пути к текущему каталогу и запускаем команду soxдля собранных имен файлов MP3.

См. также:

2
28.04.2021, 23:16

Теги

Похожие вопросы