Попробуйте заключить ваши zip-имена в кавычки, чтобы unzip знал, что это только одно имя файла:
find . -name "*.zip" -exec sh -c 'unzip -l "{}" | head -n 7' \;
Причина, по которой нам нужно заключить в кавычки {} в приведенной выше команде, заключается в том, что мы передаем строку в sh для запуска в качестве командной строки.
Я постараюсь объяснить, что происходит, шаг за шагом:
Для каждого файла, который соответствует * .zip, мы выполним команду sh -c 'unzip -l "{}" | head -n 7
.
sh -c 'blahblablah'
принимает аргумент после -c и запускает его так, как если бы он был введен в командной строке.
Итак, учитывая имя File A.zip
(с пробелом), мы выполним командную строку:
unzip -l File A.zip | head -n 7
Теперь, когда мы не цитируем имя файла, то перед вызовом unzip оболочка разделит список аргументов на отдельные аргументы, в результате получится список:
"unzip" "-l" "File" "A.zip"
это означает, что unzip
попытается открыть файл zip- File
и найти в архиве элемент A.zip
.
Если мы заключим аргумент в кавычки, оболочка расширится до следующего списка аргументов:
"unzip" "-l" "File A.zip"
Выиграть! Теперь unzip
попытается открыть zip-файл «Файл A.zip» и отобразить его содержимое.