Linux bash Как использовать результат подстановочного знака в качестве имени файла в команде копирования - PullRequest
0 голосов
/ 28 января 2019

Я пишу сценарий Linux для копирования файлов из структуры папок в одну папку.Я хочу использовать переменное имя папки в качестве префикса имени файла.

Мой текущий скрипт выглядит следующим образом.Но я не могу найти способ использовать имя папки из подстановочного знака в качестве имени файла;

for f in /usr/share/storage/*/log/myfile.log*; do cp "$f" /myhome/docs/log/myfile.log; done

Моя существующая структура / файлы папок выглядит следующим образом, и я хочу, чтобы файлы копировались как;

>/usr/share/storage/100/log/myfile.log    -->    /myhome/docs/log/100.log
>/usr/share/storage/100/log/myfile.log.1  -->    /myhome/docs/log/100.log.1
>/usr/share/storage/102/log/myfile.log    -->    /myhome/docs/log/102.log
>/usr/share/storage/103/log/myfile.log    -->    /myhome/docs/log/103.log
>/usr/share/storage/103/log/myfile.log.1  -->    /myhome/docs/log/103.log.1
>/usr/share/storage/103/log/myfile.log.2  -->    /myhome/docs/log/103.log.2

Ответы [ 3 ]

0 голосов
/ 28 января 2019
for f in /usr/share/storage/*/log/myfile.log*; do cp "$f" "$(echo $f | sed -re 's%^/usr/share/storage/([^/]*)/log/myfile(\.log.*)$%/myhome/docs/log/\1\2%')"; done
0 голосов
/ 28 января 2019

Вы можете использовать совпадение регулярного выражения для извлечения нужного компонента, но, вероятно, проще просто изменить его на /usr/share/storage, чтобы желаемый компонент всегда был первый один на пути.

После того, как вы это сделаете, достаточно просто использовать различные операторы расширения параметров для извлечения частей путей и имен файлов, которые вы хотите использовать.

cd /usr/share/storage
for f in */log/myfile.log*; do
    pfx=${f%%/*}  # 100, 102, etc
    dest=$(basename "$f")
    dest=$pfx.${dest#*.}
    cp -- "$f" /myhome/docs/log/"$pfx.${dest#*.}"
done
0 голосов
/ 28 января 2019

Один из вариантов заключается в переносе цикла for в другой цикл:

for d in /usr/share/storage/*; do
    dir="$(basename "$d")"

    for f in "$d"/log/myfile.log*; do
        file="$(basename "$f")"
        # test we found a file - glob might fail
        [ -f "$f" ] && cp "$f" /home/docs/log/"${dir}.${file}"
    done
done
...