Как разархивировать .zip файл ко всем каталогам, которые содержат .php файл, который содержит текст "дом" внутри?
Что-то как:
grep -rl --include='index.php' 'house' /directory/path/of_the_index_file* | xargs unzip /directory2/path/file.zip -d /directory/path/of_the_index_file/
РАЗЪЯСНЕНИЕ: Я просто хочу извлечь простой .zip файл с 2 файлами и одним каталогом ко всем каталогам на сервере, которые содержат index.php файл с определенной строкой в ее коде.
Я был бы очень благодарен за любую справку.
Вы могли использовать xargs sh -c '...'
вместе с $(dirname "$1")
:
grep -rlZ --include='index.php' house /directory/path/of_the_index_file* \
| xargs -0 -I{} sh -c 'unzip /directory2/path/file.zip -d "$(dirname "$1")"' xargs-sh {}
Или легче, используйте GNU parallel
, который имеет dirname
функция, включенная с помощью {//}
:
grep -rlZ --include='index.php' house /directory/path/of_the_index_file* \
| parallel -0 -n1 unzip /directory2/path/file.zip -d {//}
Избегают распараллеливания, если Вы хотите путем добавления -j1
к parallel
.
, Если parallel
не установлен, установите его использование:
sudo apt install parallel
<час> Вы могли бы считать выполнение unzip
однажды в начале к временному каталогу и использованию cp
или ln
внутренним xargs
или parallel
.
Примечание: Для обоих решений я использую grep -Z
вместе с [1 117] для предотвращения проблем с новыми строками где-нибудь в пути. Даже если это не влияет на Вас, это - хорошая привычка заботиться о нем.