Порядок выполнения команд и перенаправление [дубликат]

для системных пакетов на nixos, вероятно, лучше всего сохранить их в файле configuration.nix ( environment.systemPackages )

3
17.05.2017, 02:45
2 ответа

Это ответ на вопрос "почему это происходит?"

Да, somefile.txt будет фактически создан до запуска ls.

$ utility >file

Первое, что происходит, это то, что оболочка замечает перенаправление, создает файл (или усекает его, если он уже существует), затем выполняет утилиту со своим стандартным выходным потоком, идущим в файл.

Утилита, как правило, не осведомлена о том, куда направляется ее стандартный вывод (некоторые, например ls, проверяют, является ли это телетайпом или нет, и соответствующим образом меняют свое поведение), поэтому она не имеет значения, пишет ли он в обычный файл, канал, файл устройства или сокет. Это определенно не связано с созданием этого файла.Таким образом, задача оболочки состоит в том, чтобы удостовериться, что сантехника на месте, прежде чем процесс будет запущен, что включает в себя создание или усечение файла с именем file в приведенном выше примере.

Ответы на вашу проблему с удалением всех файлов, кроме самых новых, см. в вопросе «удалить старые файлы»

8
27.01.2020, 21:09

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

Во-первых, вам не нужно записывать вывод в файл. Команды могут взаимодействовать друг с другом напрямую, для этого и нужны каналы.

Здесь вы могли бы сделать:

ls -tU | tail -n +3 | xargs echo rm -f -- # echo for dry-run

Но в общем случае это ошибочно, так как tail работает со строками, а xargs работает со словами (возможно, в кавычках), а имена файлов не гарантируется ни один из них. Даже не гарантируется, что они являются действительным текстом. Это будет работать правильно, только если ни одно из имен файлов не содержит пробелов, новых строк, кавычек, обратной косой черты или последовательностей байтов, не образующих допустимых символов.

Если используется система FreeBSD (как предполагает ваше использование -U), вы можете использовать выходной формат json, который надежно анализируется, например:

ls --libxo=json -Ut |
  perl -MJSON::PP -l0 -0777 -ne '
    @files = map {$_->{name}} @{
      decode_json($_)->{"file-information"}->{directory}->[0]->{entry}
    };
    print for @files[2..$#files]' | xargs -0 echo rm -f --
2
27.01.2020, 21:09

Теги

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