find: './proc/1/map_files': Permission denied

#!/bin/bash
for i in {01..84}; do
    x=$(printf '%02d' $i)
    set -- $x?*.csv
    if [ -f "$1" ]; then
        cp "$1" $i.csv
        shift
        if [ -f "$1" ]; then
            tail -q -n +2 "$@" >> $x.csv
        fi
    fi
done

Для каждого префикса он устанавливает список файлов с этим префиксом в качестве аргументов, так что вы можете использовать $1 для доступа к первому и т.д.

Если $1 - это файл (чтобы поймать случай, когда нет файлов с данным префиксом), то скопируйте этот файл в prefix.csv. Затем проверьте, было ли более одного файла с таким префиксом, сдвинув первый файл и проверив, что следующий также является файлом. Если да, пропустите строку заголовка каждого файла с помощью команды tail и добавьте ее в файл prefix.csv.

Опция -q к tail предназначена для подавления строки заголовка, которую добавляет сам tail, если в списке аргументов передано более одного файла; именно отсюда взялись ваши строки ==> 19XXX.csv <==.

Возможно, в вашем решении нужна только опция -q, но я нахожу ее слишком сложной, требующей от bash буферизации вывода команды tail и т.д., что может быть причиной преждевременной остановки (краха?) скрипта.

EDIT: добавлено x=$(printf '%02d' $i), так как {01..84} расширяется до 1 2 3 ... без ведущих нулей.

1
19.03.2019, 11:49
1 ответ

Ваша команда верна (хотя и немного усложнена, использование опции nameкоманды findвместо grepping было бы лучше ).

find / -type d -name adminer

/proc— это особая файловая система, содержащая информацию о запущенных процессах. Поэтому не все доступно (даже для root ). В Linux Documentation Project есть хорошее описание :

.

https://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html

4
27.01.2020, 23:22

Теги

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