Во-первых, установите 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/ \;
Ваша вторая строка является неправильной, и чрезмерно сложной так или иначе. Дескрипторы файлов для stdin
, stdout
, и stderr
0
, 1
, и 2
, соответственно, так для чтения из stdin
Вы хотели бы иметь
while read CMD <&0; do
Однако с тех пор stdin
вход по умолчанию для read
,
while read CMD; do
действительно самый простой способ пойти. Таким образом, можно вручную ввести команды или использовать перенаправление на командной строке для чтения из файла.