Используя вход файла как stdin для сценария оболочки не работает

Во-первых, установите AVFS, файловая система, которая обеспечивает прозрачный доступ в архивах, и выполняет команду mountavfs. Посмотрите, Как делают меня рекурсивно grep через сжатые архивы? для фона.

После этого если /path/to/archive.zip признанный архив, затем ~/.avfs/path/to/archive.zip# каталог, который, кажется, содержит содержание архива.

Запишите вспомогательный названный сценарий has_large_file_rec это ищет большой XML-файл в zip-файле, передал как аргумент и называет себя рекурсивно на каждом встроенном zip-файле. Этот сценарий производит некоторый вывод, если он находит большой XML-файл внутри. Вывод является усеченным для эффективности, с тех пор после того как мы нашли один большой XML-файл, который мы могли бы также прекратить искать.

#!/bin/sh
## auxiliary script has_large_file_rec
find "$1#" -name '*.zip' -type f -exec has_large_file_rec {} \; \
        -o -name '*.xml' -type f -size +1024k -print | head -n 1

На верхнем уровне при нахождении большого файла переместите его в большой каталог файла.

find "~/.avfs$PWD" \
  -name '*.zip' -sh -c '
      a=$(has_large_file_rec "$0")
      if [ -n "$a" ]; then mv "$0" ~/big-files/; fi
                       ' {} \; -o \
  -name '*.xml' -type f -size +1024k -exec mv {} ~/big-files/ \;

0
12.07.2013, 13:53
1 ответ

Ваша вторая строка является неправильной, и чрезмерно сложной так или иначе. Дескрипторы файлов для stdin, stdout, и stderr 0, 1, и 2, соответственно, так для чтения из stdin Вы хотели бы иметь

while read CMD <&0; do 

Однако с тех пор stdin вход по умолчанию для read,

while read CMD; do

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

4
28.01.2020, 02:21

Теги

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