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"
(кавычки защищают от пробелов в именах).