Я бы посоветовал избегать зацикливания вывода команды find
по причинам, обсуждаемым здесь:
Вместо этого рассмотрите возможность использования -execdir
с одним вкладышем -для удаления компонентов пути:
#!/bin/bash
export NOW=$(date +%Y-%m-%d-%H%M%S)
find /path/to/file -type f ! -name '*.*' -execdir sh -c '
for f; do echo mv "$f" "${NOW}_${f#./}"; done
' find-sh {} +
Удалите echo
, как только убедитесь, что он работает правильно. Обратите внимание, что NOW
необходимо экспортировать, чтобы его значение было доступно в подоболочке sh -c
.
Если ваша реализация find
не предоставляет -execdir
, вы можете использовать -exec
, если вы удалите и замените путь явно:
find /path/to/file -type f ! -name '*.*' -exec sh -c '
p="${1%/*}"; echo mv "$1" "$p/${NOW}_${1##*/}"
' find-sh {} \;
Установить напоминание о сбое после цикла:
#!/bin/sh
fail=false
while IFS= read -r pattern; do
if ! grep -e "$pattern" abc.txt; then
fail=true
fi
done <xyz.txt
"$fail" && exit 1
Это считывает шаблоны из xyz.txt
построчно и применяет grep
к abc.txt
для каждого шаблона по очереди. Если шаблон не соответствует, переменная fail
устанавливается в строкуtrue
(после того, как она была false
с самого начала ).
После цикла $fail
используется как команда, а exit 1
запускается, завершая сценарий с нулевым статусом выхода, отличным от -, в зависимости от того, является ли fail
true
или false
.
Вывод команды grep
записывается в стандартный вывод, что, я полагаю, вам нужно, иначе не имеет смысла тестировать все шаблоны после нахождения одного, который не соответствует.