readlink-f не работающий над несколькими файлами

[119337] Я только что нашел [119661] эту реимплементацию цветов на основе птрейса: PRoot[119662].

Функция привязки - это именно то, что я искал!

Это надежнее, чем замена строк в исполняемом + может быть легко использована в скриптах...[119342]

1
14.01.2015, 01:00
2 ответа
#!/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... без ведущих нулей.

-121--205437-

С sed ...

getval() { sed "/^\([^=]*,\)*$1[,=]/!d;s/.*=//;q"; } <infile

Возможно, потребуется проверить $1 в качестве входных данных.

Или с GNU grep и cut :

getval() { grep -Em1 "^([^=]*,)*$1[,=]" | cut -d= -f2-; } <infile
-121--133726-

Можно также использовать realpath :

% realpath *
/data/code/mdweb/Gemfile
/data/code/mdweb/Gemfile.lock
/data/code/mdweb/README.markdown

realpath не является POSIX. Он доступен по умолчанию в системах FreeBSD, и в некоторых (но не во всех) системах Linux (но AFAIK может быть установлен как пакет в большинстве, если не во всех системах Linux). Поведение
realpath может быть различным в различных реализациях, поэтому вышеупомянутое поведение не гарантировано для работы . Я протестировал его на FreeBSD 10 & Arch Linux.

2
27.01.2020, 23:17

ReadLink работает только с одним файлом, вам нужен цикл, чтобы сделать это:

for f in *; do
  readlink -f -- "$f"
done
3
27.01.2020, 23:17

Теги

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