1

Я использовал >>
logsave path/log.txt найти. -name "* .zip" -exec sh -c 'unzip -l {} | голова -n 7 '\; чтобы получить список файлов внутри zip-файлов в определенной папке. Вот проблема, если имя файла содержит один или несколько пробелов, оно просто пропускает файлы. Dir структура


Dir ..

..........File1.zip ** без пробела в имени

...........Fi le2.zip ** С пробелом в названии

...........Файл 3.zip ** с пробелами в названии

Для приведенного выше случая имена файлов в file1.zip указаны только. Может кто-нибудь порекомендовать решение.

1 ответ1

2

Попробуйте заключить ваши 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» и отобразить его содержимое.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .