Быстрый скрипт, адаптируйся как хочешь:
#!/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, поэтому он должен быть быстрее (хотя это заметно только с сотнями файлов).