Есть ли способ использовать трубы для именования переменной?

с zsh :

src=(${(f)"$(<src.txt)"})
for f (${(f)"$(<dest.txt)"})
(($src[(Ie)$f:t])) && mv /src/dir/$f:t $f

Читает каждый файл в массиве, а затем для каждого элемента в массиве "dest" , если базовое имя (: t - это модификатор zsh , который удаляет все ведущие компоненты имени пути) также находится в массиве «src» , затем он перемещает файл. Для выполнения пробного запуска replace mv с printf '"% s" -> "% s" \ n' .


Теперь вы также можете запустить (все еще в zsh ):

for f (${(f)"$(grep -Ff src.txt dest.txt)"})
mv /src/dir/$f:t $f

, который работает нормально, пока ни одно из имен файлов в src.txt не соответствует ни одному каталогу имена (или часть этого имени) в списке путей в dest.txt (например, имя файла data1 в src.txt и путь вроде / path / data1_dir / some_file в dest.txt даст ложное срабатывание). Чтобы избежать этого, вы можете передать имена файлов в grep в виде шаблонов (т. Е. Используя регулярное выражение типа / filename $ ) вместо F фиксированных строк, чтобы они соответствовали только последний компонент путей в dest.txt . Хотя это требует экранирования всех специальных символов (если они есть) в именах файлов в src.txt , например на этот раз с bash ( 4 ):

readarray -t files < <(sed 's|[[\.*^$/]|\\&|g;s|.*|/&$|' src.txt | grep -f- dest.txt)
for f in "${files[@]}"; do mv /src/dir/"${f##*/}" "$f"; done
3
29.01.2018, 02:47
1 ответ

SystemTap с помощью debuginfo может отслеживать вызовы функций в библиотеках; в системе Centos 7:

$ sudo stap -L 'process("/lib64/libglib*").function("*strndup*")'
process("/usr/lib64/libglib-2.0.so.0.5000.3").function("g_strndup")
$ 

И это можно использовать как probeточку, которая печатает обратные трассировки или что угодно, что вы хотите, что может быть записано с помощью SystemTap:

probe begin {
    printf("ok\n")
}
probe process("/usr/lib64/libglib-2.0.so.0.5000.3").function("g_strndup") {
    /* printf("%s[%d]\n", execname(), pid()) */
    print_usyms(ubacktrace())
}

сохранено как probelibraryfunc.stpэто можно запустить через

$ sudo stap probelibraryfunc.stp

хотя может выдавать сумасшедшие объемы вывода, если вызов является обычным...

4
27.01.2020, 21:18

Теги

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