zcat файл, вывод его содержимого в другой файл на основе исходного имени файла

Я ищу создать сценарий bash / perl в Linux, который будет восстанавливать файлы.gz на основе имени файла:

_path_to_file.txt.gz
_path_to_another_file.conf.gz

Где подчеркивания образуют структуру каталогов.. так что два выше были бы:

/path/to/file.txt
/path/to/another/file.conf

Это все в каталоге /backup/.

Я хочу написать сценарий, который будет помещать каждый файл.gz в правильное местоположение, изменяя _ на /, чтобы найти правильный путь - так, чтобы содержимое _path_to_another_file.conf.gz заменял текст в / path / на / another / file.conf

zcat _path_to_another_file.conf.gz > /path/to/another/file.conf

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

ls /backup/ |grep .gz > /backup/backup_files && sed -i 's,_,\/,g' /backup/backup_files && cat /backup/backup_files

Что думаете?

2 ответа

Решение

Вот скрипт Bash, который должен делать то, что вы хотите:

#!/bin/bash
for f in *.gz; do
    n=$(echo $f | tr _ /)
    zcat $f > ${n%.*}
done

Он перебирает все файлы, оканчивающиеся на.gz, и извлекает их в путь, представленный именем файла с _ заменено на /,

Это не обязательно обратимое отображение (что если исходный файл называется high_scores например? это кодируется специально, например, с двойным подчеркиванием как high__scores.gz?) но если вы просто хотите взять имя и перевести _ в / и удалить .gz в конце, sed сделаю это:

for name in /backup/*.gz; do
    newname=$(echo "$name" |
        sed -e 's,^/backup/,,' \
            -e 's,_,/,g' \
            -e 's/\.gz$//')
    echo "zcat $name > $newname"
done

Убедитесь, что он работает правильно (вышеизложенное полностью не проверено!), Затем уберите эхо, оставив:

    zcat "$name" > "$newname"

(кавычки защищают от пробелов в именах).

Другие вопросы по тегам