Вы можете удалить заголовки из вывода 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
Это делает 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
, чтобы вы знали. Мы по-прежнему можем использовать 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.
См. также: