Почему перенаправление вывода цикла зависит от имени файла?

Не думаю, что ты сможешь сделать это вот так.

Ты должен быть более творческим и, например, разделить вручную.

Заполните карту USB первым 32G:

tar czf - / | dd if=/dev/stdin of=/usbstick/bla bs=32k count=100k iflag=fullblock

Запишите первый 32G полученного tar в пункт назначения

dd if=/usbstick/bla of=/tarfile bs=32k count=100k

Заполните карту USB следующим 32G:

tar czf - / | dd if=/dev/stdin of=/usbstick/bla bs=32k count=100k iflag=fullblock skip=100k

Запишите 32G-64G в пункт назначения:

dd if=/usbstick/bla of=/tarfile bs=32k count=100k seek=100k

Сделайте это (увеличивайте пропускать и искать каждый раз на 100k) до тех пор, пока tar-файл в пункте назначения не будет завершен.

Наконец, извлеките tar

tar -C /destination xzf /tarfile

Чувак, я бы просто подключил кроссоверный кабель.

0
30.09.2015, 01:34
1 ответ

Если у вас есть следующая команда:

command > file

Стандартный вывод (fd 1) команды command перенаправляется в файл file. Если файл не существует, он создается. Команда обычно перенаправляет вывод своей команды в дескриптор файла 1 (stdout).

При использовании выражения, как указано выше (где вывод перенаправляется в файл), файл должен существовать до начала потока вывода. Поэтому bash создает файл (пустой) и подключает его к stdout команды command, которая затем начинает писать на этот файловый дескриптор.

Это обрабатывается оболочкой. Команда не знает, пишет ли она в анонимную трубу или в файл.


Учитывая эту команду:

for file in `ls *.csv`; do cat $file | tail -n +2 | cat; done > result.csv

Что здесь происходит, файл result.csv создается пустым. Затем в цикле for перебираются все файлы, окончание которых csv (включая result.csv). Обрабатываются файлы a.csv, затем b.csv и, как минимум, result.csv. Вторая строка result.csv в затем b1. Поэтому в файле результата у вас есть 2 строки.

2
28.01.2020, 02:35

Теги

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