Я написал команду find, которая находит файлы, но исключает другие файлы / каталоги. Я повторил этот код и скопировал его. Если я вставлю это в терминал, это работает. Некоторые файлы были исключены. Но если я выполню его из сценария, он не будет работать должным образом.
Я пытался экранировать свои переменные, заключать их в кавычки, такие как $()
или ${}
, но ничего не получалось.
Мой код поиска выглядит так:
find ${StartDirs[*]} $pat -print
Фактически это будет выполнено как:
find ./bin -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print
Второй код выше работает в терминале, но не в скрипте.
Что я сделал не так?
Для получения дополнительной информации я постараюсь вставить необходимый код ниже
Я пытаюсь сделать резервную копию и хочу сделать это с помощью find и cp. Большая часть кода моего скрипта опущена. Я думаю, что код ниже является необходимым минимальным кодом для этой проблемы.
StartDirs=();
ExcludedFiles=(); #files/directories which needs to be excluded
#check and store excluded files
CheckExcludedFile(){ #this function will be called over and over again by another function (getopts). It depends on the chain of -x options. With the -x option I can decide which file i want to exclude. The Getopts function is also omitted.
exclFile=`find $1 2>/dev/null | wc -l`
if [ $exclFile -lt 1 ]; then
echo $FILEMAPNOTEXIST | sed 's~-~'$1'~g' # FILEMAPNOTEXIST is a variable from another script with error messages
exit 0
else
ExcludedFiles+=($1) #add excluded file/dir path to array
fi
}
MakeBackup(){
for i in ${ExcludedFiles[*]}
do
s=" -wholename $i -prune -o"
pat=$pat$s
done
# the code above edits the array elements of the EcludedFIles[]
#For example by calling the script with the -x option (-x fileA -x fileB -x fileC) wordt als volgt: -wholename 'fileA' -prune -o -wholename 'fileB' -prune -o -wholename 'fileC' -prune -o.
#the pat variable will be used for the find command to ignore files/directories
mkdir -p ~/var
echo "Start-time $(date '+%F %T')" >> ~/var/dq.log
find ./bin -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print
#the code above should work like in terminal. That is not the case..
# find ${StartDirs[*]} $pat -print #this should work also.
# cp -av ${StartDirs[@]} $Destination >> ~/var/dq.log find command not working therefore this rule is commented
echo "end-time $(date '+%F %T')" >> ~/var/dq.log
}
Ожидаемый результат должен состоять в том, что некоторые файлы / каталоги должны быть исключены, если даны.
Если необходим полный скрипт, дайте мне знать.