Быстрый скрипт, адаптируйся как хочешь:
#!/usr/bin/env bash
find /project/ -name '*.pdf' -print0 | while read -d $'\0' i; do
if [ ! -e "${i/%.pdf/-project.zip}" ]; then
echo "${i/%.pdf/-project.zip} doesn't exist!"
fi
done
exit 0
-d $'\0' устанавливает разделитель для read на nullbyte, в то время как -print0 является эквивалентом для find , так что это должно быть пуленепробиваемым для файлов с пробелами и символами новой строки в их именах (очевидно, не имеет значения в этом случае, но полезно знать в генеральный). ${i/%.pdf/-project.zip} заменяет .pdf в конце переменной $i на -project.zip . Кроме этого, это все стандартные сценарии оболочки.
Если вы хотите сократить его еще больше, вы также можете использовать
[ -e "${i/%.pdf/-project.zip}" ] || echo "${i/%.pdf/-project.zip} doesn't exist!"
... вместо оператора if . Я думаю, что if легче работать, если вы используете более одной короткой строки (вы можете обойти это, используя функцию, но в этот момент вы не получите никакой экономии в psace по сравнению с использованием if),
Предполагая, что у вас есть bash 4+ (вы, вероятно, делаете; вы можете проверить с помощью bash --version), вы можете использовать опцию globstar вместо find:
#!/usr/bin/env bash
shopt -s globstar
for f in /project/**/*.pdf; do
if [ ! -e "${f/%.pdf/-project.zip}" ]; then
echo "${f/%.pdf/-project.zip} doesn't exist!"
fi
done
exit 0
Это имеет преимущество, заключающееся в том, что это чистый bash, поэтому он должен быть быстрее (хотя это заметно только с сотнями файлов).